R中按GroupID分组的值出现次数

R中按GroupID分组的值出现次数,r,aggregate,R,Aggregate,我有一个数据集,它有多个列,每个列有多个值。我想要的是将每列中的每个值的计数按groupID分组 示例 GroupId | C1 | C2 1 | "valColOne1" | "valColTwo2" 2 | "valColOne1" | "valColTwo2" 2 | "valColOne1" | "valColTwo2" 2 | "valColOne2" | "valColTwo1"

我有一个数据集,它有多个列,每个列有多个值。我想要的是将每列中的每个值的计数按groupID分组

示例

 GroupId | C1            |    C2
      1  | "valColOne1"  | "valColTwo2"
      2  |  "valColOne1" | "valColTwo2"
      2  |  "valColOne1" | "valColTwo2"
      2  |  "valColOne2" | "valColTwo1"
      1  |  "valColOne1" | "valColTwo1"
    GroupId | valColOne1 | valColOne2 | valColTwo1 | valColTwo2
         1  |    2       |     0      |    1       |  1
         2  |    2       |     1      |    1       |  2
并且结果应该是

 GroupId | C1            |    C2
      1  | "valColOne1"  | "valColTwo2"
      2  |  "valColOne1" | "valColTwo2"
      2  |  "valColOne1" | "valColTwo2"
      2  |  "valColOne2" | "valColTwo1"
      1  |  "valColOne1" | "valColTwo1"
    GroupId | valColOne1 | valColOne2 | valColTwo1 | valColTwo2
         1  |    2       |     0      |    1       |  1
         2  |    2       |     1      |    1       |  2

提到初始表中的所有值都将是字符串。

获取原始数据帧(我称之为
dat
)并
将其融化为长格式。然后使用
dcast
计算每个值的出现次数

library(reshape2)

dat.m = melt(dat, id.var="GroupId")

dcast(dat.m, GroupId ~ value)

  GroupId   valColOne1    valColOne2   valColTwo1  valColTwo2
1       1             2             0           1           1
2       2             2             1           1           2

如果运行每个函数并查看中间结果,最容易看到它们的功能。有关一些示例,请参见和

您可以从
base R

table(data.frame(GroupId= df1$GroupId, Val=unlist(df1[-1])))
#         Val
# GroupId valColOne1 valColOne2 valColTwo1 valColTwo2
#  1          2          0          1          1
#  2          2          1          1          2
数据
df1使用
dplyr/tidyr
,分组方式,do(表格),排列可能会做。@Khashaa谢谢。你能在这个问题上再扩展一点吗。我不是一个真正的R方面的专家,所以任何进一步的解释都会有帮助。你已经有了几个很好的答案:)太好了!你能解释一下每个函数的作用吗?以前从未使用过整形。包装也很好。没想到会有这么简单的方法:)