遵循这个有效的例子:
case <- c('a','a','a','b','b','c','c','c','c','d','d','e','e')
ID <- c('aa','bb','zz','aa','cc','ee','ff','gg','kk','aa','kk','cc','dd')
score <- c(1,1,3,4,2,3,2,2,1,1,3,3,2)
df1 <- data.frame(case, ID, score)
identifier <- c('aa','bb','ff')
对于每个unique
案件,(即a,b,c,d ......),我想扫描ID
列,看看我们有多久具有identifier
值。
case==a
,然后ID
等于identifier
多少次? (在这种情况下2次)case==b
,并计算ID
等于identifier
的时间? (在这种情况下1次)unique
案例我使用了以下命令,但这是针对整个示例的,不是按照唯一case
df1$ID %in% identifier
我想要的最终结果是一个表格,其中一列包含每个唯一case
,第二列的次数ID
和identifier
相等。< / p>
所以我想循环/自动化该过程并返回类似的输出:
data.frame(c('a','b','c','d','e'), c(2,1,1,1,0))
答案 0 :(得分:2)
您可以使用tapply()
:
tapply(df1$ID, df1$case, FUN = function(id) sum(id %in% identifier))
a b c d e
2 1 1 1 0
但正如@Jaap指出的那样,您可以使用aggregate()
来获取data.frame:
aggregate(ID ~ case, data = df1, FUN = function(id) sum(id %in% identifier))
case ID
1 a 2
2 b 1
3 c 1
4 d 1
5 e 0
如果你想要更多的分组,你可以做到:
df <- aggregate(ID ~ case+(score>1), data = df1, FUN = function(id) sum(id %in% identifier))
df[df$`score > 1`,c(1,3)]
case ID
4 a 0
5 b 1
6 c 1
7 d 0
8 e 0