使用这个数据集。
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)))
输入和建议是赞赏
在基础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
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)