2017-01-01 7 views
3

私がしようとしているのは、列bの行が2の場合、列aの前の行の値に3を加算する場合です。条件が満たされない場合は、前の行の値を変更したくありません。しかし、このコードを試してみると、Rは後続の行に追加されています。そして、-1行の参照を置き換えても、それは常に後続の行に追加されても問題ありません。条件が満たされた場合に前の行に値を追加する方法

df$a[-1] <- ifelse(df$b == 2, df$a[-1] + 3, df$a[-1]) 

Have        Want 
a b        a b 
0 1        0 1 
1 3        4 3 
2 2        2 2 
2 4        2 4 
4 5        4 5 
+0

また、あなたはSO上でコードの空白のために余分に払っていない、それは、メンバーシップの計画に含まれています。 – hrbrmstr

答えて

2

別のアプローチ

df <- data.frame(a=c(0, 1, 2, 2, 3), 
      b=c(1, 3, 2, 4, 4)) 

df$a[c(df$b[-1], 0) == 2] <- df$a[c(df$b[-1], 0) == 2] + 3 
+0

共通の条件を別の行にまとめることができます。 –

+0

ありがとう、これは私のために働いた。 – grig109

3

一つの解決策:

私はそれが最も簡単なだけので同じように、直接ベクターを用いて動作するように見つけるだろう:あなたのコードで

df$a <- df$a + c((df$b[-1] == 2) * 3, 0) 

問題:

最初の引数の各要素であるdf$b==2は、df$aの次の行と一致します。さんは説明する、あなたの質問に例を見てみましょう。ここでは

df <- data.frame(a=c(0,1,2,2,4), b=c(1,3,2,4,5)) # As in your question 

df$b==2c(FALSE, FALSE, TRUE, FALSE, FALSE)と同等です。

df$a[-1]は、全てdf$aの要素です(ただし、最初はc(1,2,2,4)と等価です)。引数の長さが異なるため、c(1,2,2,4,1)のように、df$a[-1]の最初の要素が繰り返し/ループされます。

したがって、あなたの文で、df$b==2の最初の要素はdf$a[-1]の最初の要素、または(後続の行IE)df$aの第二の要素に整合され、及びdf$b==2の第2の要素は、の3番目の要素に一致しますあなたのコードを調整する方法を

ifelse(df$b==2, df$a[-1]+3, df$a[-1]) 
# Output: 1 2 5 4 1 

df$aなどこの例では

は、あなたのコードは次の出力を与えるだろう

あなたがそうでdf$aの最初とにdf$bの第二の要素を比較したいので、次のように、あなたのコードを調整することができます:

df$a[-nrow(df)] <- ifelse(df$b[-1]==2, df$a+3, df$a) 

私の説明のいずれかが不明である場合は、コメントすること自由に感じ、私は助けようとします!

+1

詳細な説明をありがとう。それは私の最初の試みで論理をよりよく理解するのに役立ち、なぜそれが失敗したのか。 – grig109

関連する問題