我们说我的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
,但不知何故它不起作用。感谢。
答案 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')]