如何解决每组将某些行的中位数除以其他行的中位数
group_ID <- c("a","a","b","b")
class <- c("p","q","p","q")
var1 <- c(3,1,3,2,4,1)
my_table <- data.frame(group_ID,class,var1)
我有下表。
group_ID class var1
a p 3
a q 1
a q 1
a q 1
a q 1
b p 3
b p 2
b p 1
b q 1
b q 2
b q 2
b q 4
b q 1
我想通过将每组p类的var1的中位数除以q类的中值var1来创建新列。预期的输出如下所示。
group_ID class var1 var1_ratio
a p 3 3
a q 1 3
a q 1 3
a q 1 3
a q 1 3
b p 3 1
b p 2 1
b p 1 1
b q 1 1
b q 2 1
b q 2 1
b q 4 1
b q 1 1
Link:这个问题似乎与我的问题最相似,我尝试如下使用group_by()
和mutate_each()
,但我无法解决这个问题。
my_table <- my_table %>%
group_by(group_ID,class) %>%
mutate_each(funs(./median(.[class == "p"])),var1)
谢谢!
解决方法
我们不需要mutate_each
library(dplyr)
my_table %>%
# // grouped by group_ID,class
group_by(group_ID,class) %>%
# // create a median column
mutate(Median= median(var1)) %>%
# // reset the grouping by removing class
group_by(group_ID) %>%
# // divide the first element of subset of Median for each class
mutate(var1_ratio = first(Median[class == 'p'])/first(Median[class == 'q']),Median = NULL)
# A tibble: 13 x 4
# Groups: group_ID [2]
# group_ID class var1 var1_ratio
# <chr> <chr> <dbl> <dbl>
# 1 a p 3 3
# 2 a q 1 3
# 3 a q 1 3
# 4 a q 1 3
# 5 a q 1 3
# 6 b p 3 1
# 7 b p 2 1
# 8 b p 1 1
# 9 b q 1 1
#10 b q 2 1
#11 b q 2 1
#12 b q 4 1
#13 b q 1 1
,
这是基本的R解决方案。它两次使用aggregate
,一次计算中位数,然后计算比率。然后,它与原始合并以将新的列值放在它们的位置。
agg <- aggregate(var1 ~ .,my_table,median)
agg <- aggregate(var1 ~ group_ID,agg,function(x) x[1]/x[2])
names(agg)[2] <- "var1_ratio"
merge(my_table,agg)
,
您还可以尝试创建摘要并加入原始数据:
library(tidyverse)
my_table %>% left_join(my_table %>%
group_by(group_ID,class) %>%
summarise(Median=median(var1)) %>%
pivot_wider(names_from = class,values_from = Median,names_prefix = 'Median.')) %>%
mutate(Ratio=Median.p/Median.q) %>% select(-c(Median.p,Median.q))
输出:
group_ID class var1 Ratio
1 a p 3 3
2 a q 1 3
3 a q 1 3
4 a q 1 3
5 a q 1 3
6 b p 3 1
7 b p 2 1
8 b p 1 1
9 b q 1 1
10 b q 2 1
11 b q 2 1
12 b q 4 1
13 b q 1 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。