在每个组织中计算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)
虽然它更容易。
答案 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())