我在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
的值,该值显示先前出现(creatorid
,responderid
)组合的次数。例如,在这种情况下的输出将是:
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
我预感到这可以通过dlply
和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
有关完成此任务的简单有效方法的任何建议吗?
答案 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)})