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

これは と で簡単にできることだ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

このタスクを達成するための簡単で効率的な方法について何か提案はありますか?

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 に答える