2

例を使用してやりたいことを説明する方がおそらく簡単です...次のデータフレームがあるとします:

id1 id2 var
1   2   a
2   3   b
2   1   a
3   2   a
2   3   a
4   2   a
3   1   b

次のように生成できます

df <- data.frame(id1 = c(1,2,2,3,2,4,3),
                 id2 = c(2,3,1,2,3,2,1),
                 var = c('a','b','a','a','a','a','b'))

id2 が同じ var で id1 に出現した回数の累積カウントが必要なので、最終的には

id1 id2 var count
1   2   a   0
2   3   b   0 
2   1   a   1
3   2   a   1
2   3   a   1
4   2   a   2
3   1   b   0

したがって、行 3 (行 1) の前に id1 = 1 と var = 'a' があるため、行 3 のカウントは 1 です。次に、行 4 では、id1 = 2 と var 'a' があるため、カウントも 1 です。行 3 (行 4 の前にのみチェックするため、行 5 に表示されるものは数えないでください)。

id1 が id1 に出現した回数を確認していた場合、次のようにします

with(df, ave(id1 == id1, paste(id1, var), FUN = cumsum))

id2 に対してこれをすばやく簡単に行う方法はありますか?

前もって感謝します

4

2 に答える 2

4

もっとエレガントな方法があるかもしれませんが、これで仕事は完了です。ここで重要なのはsplit<-関数です。

df$count <- NA # This column must be added prior to calling `split<-`
               # because otherwise we can't assign values to it
split(df, df$var) <- lapply(split(df, df$var), function(x){
    x$count <- cumsum(sapply(1:nrow(x), function(i) x$id2[i] %in% x$id1[1:i]))
    x
})

結果は次のとおりです。いくつかの不一致があるため、手動で目的の結果を作成する際にエラーが発生したか、質問を誤解したかのいずれかです。

  id1 id2 var count
1   1   2   a     0
2   2   3   b     0
3   2   1   a     1
4   3   2   a     2
5   2   3   a     3
6   4   2   a     4
7   3   1   b     0

アップデート:

この回答を完全にして機能させるために、これがあなたのソリューションに対する私の見解です。本質的には同じですが、 . のave中にlapply.

df$count <- NA
split(df, df$var) <- lapply(split(df, df$var), function(x){
    hit <- sapply(1:nrow(x), function(i) x$id2[i] %in% x$id1[1:i])
    x$count <- ave(hit, x$id2, FUN=cumsum)
    x
})
于 2013-10-21T10:18:13.337 に答える
1

バックリンの回答を使用して編集して、必要なものを取得しました。コードは次のとおりです

df$count<- NA 

split(df, df$var) <- lapply(split(df, df$var), function(x){
    x$count<- sapply(1:nrow(x), function(i) sum(x$id2[i] == x$id1[1:i]))
    x
})

おそらくもっとエレガントな方法がありますが、これでうまくいくと思います...

于 2013-10-21T10:44:03.577 に答える