1

我在 R 中有一个数据框,该数据框之前已使用如下所示的数据进行了排序:

id creatorid responderid
 1         1           2
 2         1           2
 3         1           3
 4         1           3
 5         1           3
 6         2           3
 7         2           3

我想添加一个值,调用数据框,显示 ( , ) 组合之前出现repetition了多少次。例如,这种情况下的输出将是:creatoridresponderid

id creatorid responderid repetition
 1         1           2          0
 2         1           2          1
 3         1           3          0
 4         1           3          1
 5         1           3          2
 6         2           3          0
 7         2           3          1

我有一种预感,这是可以用dlplyand轻松完成的事情transform,但我一直无法解决。这是我用来尝试的简单代码:

dlply(df, .(creatorid, responderid), transform, repetition=function(dfrow) {
    seq(0,nrow(dfrow)-1)
})

不幸的是,这会引发以下错误(从我的真实数据中粘贴 - 第一次重复出现 166 次):

Error in data.frame(list(id = c(39684L, 55374L, 65158L, 54217L, 10004L,  : 
   arguments imply differing number of rows: 166, 0

关于以简单有效的方式完成此任务的任何建议?

4

1 回答 1

3

使用plyr

ddply(df, .(creatorid, responderid), function(x) 
            transform(x, repetition = seq_len(nrow(x))-1))

使用data.table

require(data.table)
dt <- data.table(df)
dt[, repetition := seq_len(.N)-1, by = list(creatorid, responderid)]

使用ave

within(df, {repetition <- ave(id, list(creatorid, responderid), 
                FUN=function(x) seq_along(x)-1)})
于 2013-05-30T16:56:10.480 回答