R按组计算元素的出现次数

R count occurrences of an element by groups

计算一个元素在向量中或 data.frame 在每个组中出现的最简单方法是什么?
我的意思不是只计算总数(正如其他 Whosebug 问题所问的那样),而是给每个连续出现的事件一个不同的数字。

例如这个简单的数据框:(但我将使用具有更多列的数据框)

mydata <- data.frame(A=c("A","A","A","B","B","A", "A"))

我找到了这个解决方案:

cbind(mydata,myorder=ave(rep(1,nrow(mydata)),mydata$A, FUN=cumsum))   

结果如下:

 A myorder  
 A       1  
 A       2  
 A       3  
 B       1  
 B       2  
 A       4  
 A       5  

难道没有任何一个命令可以做到这一点吗?。或者使用专门的包?

我希望它稍后使用 tidyr 的 spread() 函数。

我的问题与 Is there an aggregate FUN option to count occurrences? 因为我不想知道最后出现的总数,而是每个元素的累计出现次数。

好的,我的问题有点复杂

mydata <- data.frame(group=c("x","x","x","x","y","y", "y"), letter=c("A","A","A","B","B","A", "A"))

我只知道解决我上面写的第一个例子。 但是,当我还需要第二个分组变量时会发生什么? 类似事件(字母)的分组。

group letter  "occurencies within group"  
 x      A       1  
 x      A       2  
 x      A       3  
 x      B       1  
 y      B       1  
 y      A       1  
 y      A       2  

我已经找到方法

ave(rep(1,nrow(mydata)),list(mydata$group, mydata$letter), FUN=cumsum)
though it shoould be something easier.

使用data.table

library(data.table)
setDT(mydata)
mydata[, myorder := 1:.N, by = .(group, letter)]

by 参数使 table 在名为 A 的列的组内处理。 .N 是该组中的行数(如果 by 参数为空,它将是 table 中的行数),因此对于每个子 table ,每行的索引从 1 到该子 table.

中的行数
mydata
   group letter myorder
1:     x      A       1
2:     x      A       2
3:     x      A       3
4:     x      B       1
5:     y      B       1
6:     y      A       1
7:     y      A       2

或几乎相同的dplyr解决方案

mydata %>% 
  group_by(group, letter) %>% 
  mutate(myorder = 1:n())