4

うまくいっていることを願っています。特定の条件でデータセットの累積和を計算する方法を知りたいです。私のデータセットの単純化されたバージョンは次のようになります。

t id  
22
22
R22
A41
A98
A98
A98
R98
46
46
R46
46
46
46
R46
46
A12
R54
66
R13
A13
A13
A13
A13
R13
A13

「id」の値ごとに、各 id の累積回数が表示される新しいデータ セットを作成したいのですが、t=RI の場合はカウントを再開する必要があります。

t id カウント
あ 22 1
あ 22 2
R 22 0
41 1
98 1
98 2
98 3
R 98 0
46 1
46 2
R 46 0
46 1
46 2
46 3
R 46 0
46 1
あ 12 1
R 54 0
あ 66 1
R 13 0
あ 13 1
あ 13 2
13 3
13 4
R 13 0
あ 13 1

これを行う方法についてのアイデアはありますか?前もって感謝します。

4

1 に答える 1

5

使用rle:

out <- transform(df, count = sequence(rle(do.call(paste, df))$lengths))
out$count[out$t == "R"] <- 0

data.frameこれら 2 つの列よりも多くの列があり、これら 2 つの列のみをチェックする場合は、( dfor df[, 1:2])に置き換えdf[, c("t", "id")]ます。

危険だと感じた場合do.call(paste, df)(@flodel のコメントなど)、次のものに置き換えることができます。

as.character(interaction(df))

個人的には、このセットアップで危険なことや不器用なことは何も見つかりません (適切なセパレーターがある限り、つまりデータをよく知っている限り)。ただし、そのような場合は、2 番目の解決策が役立つ場合があります。


アップデート:

do.call(paste, df)orの使用が嫌いな人のためas.character(interaction(df))に (@flodel と @HongOoi の間のコメント交換を参照してください)、別の基本的な解決策を次に示します。

idx <- which(df$t == "R")
ww <- NULL
if (length(idx) > 0) {
    ww <- c(min(idx), diff(idx), nrow(df)-max(idx))
    df <- transform(df, count = ave(id, rep(seq_along(ww), ww), 
                   FUN=function(y) sequence(rle(y)$lengths)))
    df$count[idx] <- 0
} else {
    df$count <- seq_len(nrow(df))
}
于 2013-06-21T22:50:34.660 に答える