R按组

时间:2015-09-15 12:54:45

标签: r counter

在每个组织中计算vector或data.frame上元素出现的最简单方法是什么?
我并不仅仅意味着计算总数(如其他stackoverflow问题所示),而是为每个成功的事件提供不同的数字。

例如对于这个简单的数据框:(但我将使用包含更多列的数据框)

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)
  虽然它更容易。

1 个答案:

答案 0 :(得分:6)

使用data.table

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

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

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())