在每个组中计算向量或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()函数。
我的问题与是否有一个汇总的FUN选项可以计算发生次数不同?因为我不想知道最后出现的总数,而是想知道直到每个元素的累积出现的次数。
好吧,我的问题有点复杂
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)
虽然应该更容易一些。
使用 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())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句