R - dplyr关于因子组合的总结

时间:2017-05-25 16:29:45

标签: r dplyr combinations summarize

如果我有一个简单的数据框,其中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

提前感谢您的帮助。

2 个答案:

答案 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))
)