从长格式数据创建摘要数据框

时间:2016-02-24 20:56:39

标签: r loops

遵循这个有效的例子:

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值。

  • 所以我们调查3x case==a,然后ID等于identifier多少次? (在这种情况下2次)
  • 然后我们查看2x case==b,并计算ID等于identifier的时间? (在这种情况下1次)
  • 我们为所有unique案例
  • 执行此操作

我使用了以下命令,但这是针对整个示例的,不是按照唯一case

分开的
df1$ID %in% identifier

我想要的最终结果是一个表格,其中一列包含每个唯一case,第二列的次数IDidentifier相等。< / p>

所以我想循环/自动化该过程并返回类似的输出:

data.frame(c('a','b','c','d','e'), c(2,1,1,1,0))

1 个答案:

答案 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