观察人数分组

时间:2011-11-21 08:22:58

标签: r sas

在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中实现这一目标?

谢谢,

3 个答案:

答案 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),但它应该有效。