如何检查R中每个人的值的出现?

时间:2014-05-01 06:41:37

标签: r plyr

我们说我的data.frame看起来像这样:

ID   B
1    1
1    2
1    1
1    3
2    2
2    2
2    2
2    2
3    2
3    10
3    2

现在我想检查每个ID下B的出现次数,例如no。 1,1发生两次,2发生3发生1次。没有。 2,只有2次发生4次。我该怎么做到这一点?我试图在table中使用ddply,但不知何故它不起作用。感谢。

4 个答案:

答案 0 :(得分:4)

您似乎只想要一个table

> table(dat)
##    B
## ID  1 2 3 10
##   1 2 1 1  0
##   2 0 4 0  0
##   3 0 2 0  1

然后以下显示,对于ID等于1,有两个1,一个2和一个。

> table(dat)[1, ]
##  1  2  3 10 
##  2  1  1  0 

答案 1 :(得分:2)

这是一种使用“dplyr”的方法(如果我理解你的问题):

library(dplyr)
mydf %.% group_by(ID, B) %.% summarise(count = n())
# Source: local data frame [6 x 3]
# Groups: ID
# 
#   ID  B count
# 1  1  1     2
# 2  1  2     1
# 3  1  3     1
# 4  2  2     4
# 5  3  2     2
# 6  3 10     1

在“plyr”中,我猜它会是这样的:

library(plyr)
ddply(mydf, .(ID, B), summarise, count = length(B))

在基础R中,您可以执行以下操作,只需删除0:

data.frame(table(mydf))
#    ID  B Freq
# 1   1  1    2
# 2   2  1    0
# 3   3  1    0
# 4   1  2    1
# 5   2  2    4
# 6   3  2    2
# 7   1  3    1
# 8   2  3    0
# 9   3  3    0
# 10  1 10    0
# 11  2 10    0
# 12  3 10    1

答案 2 :(得分:2)

这是一个aggregate解决方案:

> with(data, aggregate(B, list(ID=ID, B=B), length))
  ID  B x
1  1  1 2
2  1  2 1
3  2  2 4
4  3  2 2
5  1  3 1
6  3 10 1

答案 3 :(得分:1)

data.table解决方案因为必须有:

data[, .N, by=c('ID','B')]

如果您尝试将其应用于data.frame,则上述工作无效。必须先将其转换为data.table。使用更新版本的" data.table",这最容易使用setDT完成(正如David在评论中所建议的那样):

library(data.table)
setDT(data)[, .N, by=c('ID', 'B')]