【发布时间】:2022-08-22 22:46:51
【问题描述】:
我有以下数据框,并希望按 grp 列进行分组,以查看每个组中出现的每个列值的数量。
> data.frame(grp = unlist(strsplit(\"aabbccca\", \"\")), col1=unlist(strsplit(\"ABAABBAB\", \"\")), col2=unlist(strsplit(\"BBCCCCDD\", \"\")))
grp col1 col2
1 a A B
2 a B B
3 b A C
4 b A C
5 c B C
6 c B C
7 c A D
8 a B D
期望的结果:
grp col1A col1B col2B col2C col2D
1 a 1 2 2 0 1
2 b 2 0 0 2 0
3 c 1 2 0 2 1
如果我只查看grp 和col1 列,使用table() 很容易解决这个问题,当只有2 列时,我可以将table(df[c(\'grp\', \'col1\')]) 与table(df[c(\'grp\', \'col2\')]) 合并。但是,随着因子列数量的增加,这会变得非常麻烦,并且如果col1 和col2 之间存在共享值,则会出现问题。
请注意,dplyr 的计数不起作用,因为它会查找 col1 和 col2 的唯一组合。
我尝试过使用 tidyr 融化和传播数据框,但没有任何运气
> pivot_longer(df, c(col1, col2), names_to= \"key\", values_to = \"val\") %>% pivot_wider(\"grp\", names_from = c(\"key\", \"val\"), values_from = 1, values_fn = sum)
Error in `stop_subscript()`:
! Can\'t subset columns that don\'t exist.
x Column `grp` doesn\'t exist.
我可以找到很多适用于我有 1 个组列和 1 个值列的情况的解决方案,但我不知道如何将它们推广到更多列。