12

これはかなり簡単な質問だと思いますが、私の人生では答えを見つけることができないようです. 私はかなり標準的なデータフレームを持っています。私がやろうとしているのは、ある値 (正確な値またはそれ以上) に達するまで値の列を合計し、その時点で 1 を新しい列 (ラベル付き) にドロップすることですキープ) を保持し、合計を 0 から再開します。

分の列、分の差、保持列、および累積合計列があります (使用している例は、実際の完全なデータセットよりもはるかにクリーンです)

 minutes     difference     keep     difference_sum
 1052991158       0          0            0
 1052991338      180         0            180
 1052991518      180         0            360
 1052991698      180         0            540
 1052991878      180         0            720
 1052992058      180         0            900
 1052992238      180         0            1080
 1052992418      180         0            1260
 1052992598      180         0            1440
 1052992778      180         0            1620
 1052992958      180         0            1800

差分合計列はコードで計算されました

caribou.sub$difference_sum<-cumsum(difference)

私がやりたいことは、合計値が 1470 またはそれ以上の数値に達すると、保持列に 1 を入れ、その後合計を再開し、データセット全体で実行を続けるという条件で上記のコードを実行することです。

事前に感謝します。さらに情報が必要な場合はお知らせください。

アイデン

4

3 に答える 3

11

これは for ループで行うのが最適だと思いますが、すぐに使用できる関数は考えられません。以下はあなたが望むことをするはずです(私があなたを正しく理解していれば)。

current.sum <- 0
for (c in 1:nrow(caribou.sub)) {
    current.sum <- current.sum + caribou.sub[c, "difference"]
    carribou.sub[c, "difference_sum"] <- current.sum
    if (current.sum >= 1470) {
        caribou.sub[c, "keep"] <- 1
        current.sum <- 0
    }
}

希望どおりでない場合は、遠慮なくコメントしてください。しかし、アレックスワンが指摘したように、あなたの説明は完全に明確ではありません。

于 2013-03-17T22:22:38.783 に答える
8

data.frameあなたがいると仮定しますdf

df$difference_sum <- c(0, head(cumsum(df$difference), -1))
# get length of 0's (first keep value gives the actual length)
len <- sum(df$difference_sum %/% 1470 == 0)
df$keep <- (seq_len(nrow(df))-1) %/% len
df <- transform(df, difference_sum = ave(difference, keep, 
          FUN=function(x) c(0, head(cumsum(x), -1))))

#       minutes difference keep difference_sum
# 1  1052991158        180    0              0
# 2  1052991338        180    0            180
# 3  1052991518        180    0            360
# 4  1052991698        180    0            540
# 5  1052991878        180    0            720
# 6  1052992058        180    0            900
# 7  1052992238        180    0           1080
# 8  1052992418        180    0           1260
# 9  1052992598        180    0           1440
# 10 1052992778        180    1              0
# 11 1052992958        180    1            180
于 2013-03-17T22:36:26.973 に答える
2

合計がいつ再開されるべきか、そしてそれがゼロであるべきかどうかについてはまだわかりません。望ましい結果は非常に役立ちます。

とはいえ、これを行うには単純に指標付けと減算を行うのが簡単な方法だと思わずにはいられません。以下のコードは、@Henrik のソリューションと同じ結果をもたらします。

df$difference_sum <- cumsum(df$difference)
step <- (df$difference_sum %/% 1470) + 1
k <- which(diff(step) > 0) + 1
df$keep <- 0
df$keep[k] <- 1
step[k] <- step[k] - 1
df$difference_sum <- df$difference_sum - c(0, df$difference_sum[k])[step]
于 2013-03-18T02:18:26.923 に答える