如果我有一个简单的数据框,其中2个因子(a和b)有2个级别(1和2)和1个变量(x),我如何得到x的中值:中位数x超过每个因子水平a,每个级别的因子b,以及a * b的每个组合?
library(dplyr)
df <- data.frame(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)),
b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)),
x = c(runif(16)))
我尝试了各种(很多)版本:
df %>%
group_by_(c("a", "b")) %>%
summarize(med_rate = median(df$x))
对于因子a的每个级别的中位数x,结果应如下所示:
中位数 1 0.58811
2 0.53167
对于每个因子b水平的中位数x都是如此:
b中位数
1 0.60622
2 0.46096
对于a和b的每个组合的中位数x都是这样的:
a b中位数
1 1 0.66745
1 2 0.34656
2 1 0.50903
2 2 0.55990
提前感谢您的帮助。
答案 0 :(得分:0)
set.seed(123) ##make your example reproducible
require(data.table)
df <- data.table(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)),
b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)),
x = c(runif(16)))
df[, median(x), by = a]
df[, median(x), by = b]
df[, median(x), by = .(a,b)]
答案 1 :(得分:0)
以下内容不是很优雅,但会创建一个符合预期结果的data.frame
。
我们正在创建三个数据data.frames
(a,b和a * b)并将它们合并为一个。
bind_rows(
df %>%
group_by(a) %>%
rename(factor_g = a) %>%
summarize(med_rate = median(x)),
df %>%
group_by(b) %>%
rename(factor = b) %>%
summarize(med_rate = median(x)),
df %>%
# We create a column for grouping a*b
mutate(factor = paste(a, b)) %>%
group_by(factor) %>%
summarize(med_rate = median(x))
)