首页 > 解决方案 > R计数列值

问题描述

对 R 的帮助:我需要按列分组并计算一组列中值的出现次数。

这是我的数据框

ID  Ob1 Ob2 Ob3 Ob4
3792    0   0   0   1
3792    0   0   -1  0
3792    1   -2  -1  0
3792    2   -2  -1  0
8060    -1  0   -2  2
8060    -1  0   -3  0
8060    0   0   0   0
13098   0   0   0   0
13098   -1  0   -1  0
13098   0   0   0   0

我想对 ID 进行分组并计算 Ob1、Ob2、Ob3、Ob4 中的数字值。所以我的结果应该如下所示;

Group   -3  -2  -1  0   1   2
3792        2   3   8   2   1
8060    1   1   2   7       1
13098           2   10      

我试过了

table(unlist(df))

但我丢失了 groupby 信息。我在下面

-3    -2    -1     0     1     2    46  3792  8060 13098 
 1     3     7    25     2     2    10     4     3     3

标签: r

解决方案


使用table来自base R

table(data.frame(col1 = df1$ID, col2 = unlist(df1[-1])))
#   col2
#col1    -3 -2 -1  0  1  2
#  3792   0  2  3  8  2  1
#  8060   1  1  2  7  0  1
#  13098  0  0  2 10  0  0

也无需创建data.frame. 完成上述操作是为了使长度相同(因为在 中有回收data.frame)并且table需要参数具有相同的长度。所以,上面的一个变体也应该能很好地工作

table(rep(df1$ID, ncol(df1)-1), unlist(df1[-1]))

如果我们正在unlist读取整个数据集,它只是一个单一的vector,相反我们需要两个向量,一个用于第一列“ID”,第二个用于除“ID”之外的所有其他列

数据

df1 <- structure(list(ID = c(3792L, 3792L, 3792L, 3792L, 8060L, 8060L, 
8060L, 13098L, 13098L, 13098L), Ob1 = c(0L, 0L, 1L, 2L, -1L, 
-1L, 0L, 0L, -1L, 0L), Ob2 = c(0L, 0L, -2L, -2L, 0L, 0L, 0L, 
0L, 0L, 0L), Ob3 = c(0L, -1L, -1L, -1L, -2L, -3L, 0L, 0L, -1L, 
0L), Ob4 = c(1L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L)),
   class = "data.frame", row.names = c(NA, 
-10L))

推荐阅读