在R中,我有一个数据框,其中的观察结果由几个值描述,其中一个值是一个因子。我已经按照这个因素对数据集进行了排序,并希望添加一个列,在该列中我会在每个级别的因子上得到一些观察结果,例如。
factor obsnum
a 1
a 2
a 3
b 1
b 2
b 3
b 4
c 1
c 2
...
在SAS中我使用类似的东西:
data logs.full;
set logs.full;
count + 1;
by cookie;
if first.cookie then count = 1;
run;
我如何在R中实现这一目标?
谢谢,
答案 0 :(得分:13)
使用rle
(游程编码)和sequence
:
x <- c("a", "a", "a", "b", "b", "b", "b", "c", "c")
data.frame(
x=x,
obsnum = sequence(rle(x)$lengths)
)
x obsnum
1 a 1
2 a 2
3 a 3
4 b 1
5 b 2
6 b 3
7 b 4
8 c 1
9 c 2
答案 1 :(得分:5)
这是ddply()解决方案
dataset <- data.frame(x = c("a", "a", "a", "b", "b", "b", "b", "c", "c"))
library(plyr)
ddply(dataset, .(x), function(z){
data.frame(obsnum = seq_along(z$x))
})
答案 2 :(得分:3)
使用基数R的一种解决方案,假设您的数据位于名为data.frame
的{{1}}中:
dfr
可能有更好的解决方案(例如,使用包dfr$cnt<-do.call(c, lapply(unique(dfr$factor), function(curf){
seq(sum(dfr$factor==curf))
}))
及其plyr
),但它应该有效。