R-各因素组合的dplyr总结

R-各因素组合的dplyr总结,r,dplyr,combinations,summarize,R,Dplyr,Combinations,Summarize,如果我有一个包含两个因子(a和b)、两个级别(1和2)和一个变量(x)的简单数据框架,那么如何获得x的中值:因子a的每个级别、因子b的每个级别以及a*b的每个组合的中值x 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)))

如果我有一个包含两个因子(a和b)、两个级别(1和2)和一个变量(x)的简单数据框架,那么如何获得x的中值:因子a的每个级别、因子b的每个级别以及a*b的每个组合的中值x

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)))
对于因子a的每个级别的中位数x,结果应如下所示:

中位数
1 0.58811
20.53167

对于系数b的每一级的中位数x,如下所示:

b中位数
1 0.60622
2 0.46096

对于a和b的每种组合,中位数x如下:

a b中位数
1 10.66745
120.34656
21 0.50903
2 0.55990

提前感谢您的帮助

set.seed(123)##让你的例子重现
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)]
要求(数据表)
df下面的代码不是很优雅,但是它创建了一个满足您预期结果的
data.frame

我们正在创建三个data
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))
)

df$
摘要中取出
df$
您不需要引用,您可以使用
groupby
df%>%groupby(a,b)%>%summary(med_rate=median(x))
谢谢。但这给了我一个中值;16次观察的中位数x。它没有给出每个因子(a&b)的每个级别(1和2)以及每个a*b组合的每个级别的中值。@DavidG它确实给出了每个级别的中值,即4个值。也许您也加载了
plyr
库。尝试
df%>%groupby(a,b)%>%dplyr::summary(med\u rate=median9x))
Yes!非常感谢你!谢谢但是我得到了一条错误消息来响应每个“df[,median(x),by=z]命令:“unused argument(by=z)”你有一个名为z的列吗?没有。这是简写的,所以我不必重复错误消息3次:每个命令一次(by=a;by=b;by=(a,b).您加载了data.table吗?不,我没有加载data.table,因为在我的示例中df是作为数据帧创建的。但是我看到您的解决方案在数据表上工作。谢谢。
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))
)