我有下面的数据框,想按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的唯一组合.
我try 过用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.
我可以找到很多解决方案,适用于我有一个组列和一个值列的情况,但我不知道如何将它们推广到更多列.