R中的顺序编号重复相互作用

时间:2013-05-30 16:49:43

标签: r plyr

我在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

我预感到这可以通过dlplytransform轻松完成,但我无法解决这个问题。这是我用来尝试它的简单代码:

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

有关完成此任务的简单有效方法的任何建议吗?

1 个答案:

答案 0 :(得分: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)})