【问题标题】:Can we group by multiple columns in the same function with R?我们可以用 R 在同一个函数中按多列分组吗?
【发布时间】:2020-06-03 17:18:54
【问题描述】:

使用这个数据集:

sex <- c("M","F","M","M","F","F","F","M","M","F") 
school <- c("north","north","central","south","south","south","central","north","north","south")
school_type <- c("high","high","primary","secondary","secondary","secondary","primary","high", "high","secondary")
days_missed <- c(5,1,2,0,7,1,3,2,4,15)

df <- data.frame(sex, school, school_type,days_missed, stringsAsFactors = F)

col1 <- c( 'school_type')
col2 <- c('school','sex')

我们能否将数据框按col1 拆分,然后将每个结果数据框按col2 分组以创建如下输出:

$high .x
school      sex     sum
north       F       1
north       M       11

$primary .x
school      sex     sum
central     F       3
central     M       2

$seconday .x
school      sex     sum
south       F       23
south       M        0

我试过了:

purrr::map(.x=col1, .f = ~df %>% group_by_at(.x) %>%group_by(col2) %>% summarise(sum = sum(days_missed)))

欢迎输入和建议

【问题讨论】:

  • 重要的是结果是 3 个数据帧的列表,还是像 df %&gt;% group_by(school_type, school, sex) %&gt;% summarise(days_missed = sum(days_missed)) 这样的一个数据帧?
  • 是的,重要的是 3 个数据帧中的每一个都保持独立

标签: r dplyr purrr


【解决方案1】:

在基础 R 中你可以这样做:

xtabs(reformulate(c(col2,col1),"days_missed"),df) 

如果您的 R 版本 >4.0.0,那么您可以包含 asplit 函数以将其作为列表:

asplit(xtabs(reformulate(c(col2,col1),"days_missed"),df),3)

$high
         sex
school    F  M
  central 0  0
  north   1 11
  south   0  0

$primary
         sex
school    F M
  central 3 2
  north   0 0
  south   0 0

$secondary
         sex
school     F M
  central  0 0
  north    0 0
  south   23 0

【讨论】:

    【解决方案2】:
    library(dplyr)
    library(tidyr)
    
    sex <- c("M","F","M","M","F","F","F","M","M","F") 
    school <- c("north","north","central","south","south","south","central","north","north","south")
    school_type <- c("high","high","primary","secondary","secondary","secondary","primary","high", "high","secondary")
    days_missed <- c(5,1,2,0,7,1,3,2,4,15)
    
    df <- data.frame(sex, school, school_type,days_missed, stringsAsFactors = F)
    
    df2 <- df %>% group_by(school_type, school, sex) %>% summarise(days_missed = sum(days_missed)) %>% ungroup()
    
    split(select(df2, -school_type), df2$school_type)
    

    【讨论】:

    • 也可以使用group_split 例如df %&gt;% group_by(school_type, school, sex) %&gt;% summarise(days_missed = sum(days_missed)) %&gt;% group_by(school_type) %&gt;% group_split
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多