2016-04-18 12 views
0

私は上記のようなdata.frameを持っています。私は2番目の列の値に基づいて、第1列の値を交換する必要がなく、交換は1列目の数値を継続する必要がある、とするとき!ValB==A他の列に基づいた列の値を置き換えますが、最初の置換えの数値インデックスに従います

>df1 
ValA ValB 
    1  A 
    1  A 
    2  A 
    2  A 
    3  A 
    3  A 
    4  A 
    4  A 
    1  B 
    1  B 
    1  B 
    2  B 
    2  B 
    3  B 
    4  B 
    4  B 
    1  C 
    1  C 
    2  C 
    2  C 
    3  C 
    3  C 
    4  C 
    1  C 

だけ私が欲しいのカラム1の値を置き換えますcolumn1の値を置き換えますが、ValB==Bをインデックスとして使用して、ValAの値を置き換えます。置換は、ValAの値を続ける必要があります。つまり、1ValB==Bがある場合は、5である必要があります。26などである必要があります。ここに希望の出力があります、私は何をしているのか理解しやすくなります。

所望の出力、Iはifelseif文でループのために行うことができますが、私はクリーンな方法があることを確信しています

>df1 
ValA ValB 
    1  A 
    1  A 
    2  A 
    2  A 
    3  A 
    3  A 
    4  A 
    4  A 
    5  B 
    5  B 
    5  B 
    6  B 
    6  B 
    6  B 
    7  B 
    7  B 
    8  C 
    8  C 
    9  C 
    9  C 
    10  C 
    10  C 
    11  C 
    12  C 

答えて

1

あなたはこのような何かを行うことができます。タイトルが示すとは異なり、にリンクしていないように見える、

# do a running sum of the values 
df$c = cumsum(
    c(
    # first value of the result is the same value as the first value of A 
    df$ValA[1], 
    # go through the second to the last value of the vector and compared it to the first to the n - 1th values 
    sapply(
     2:nrow(df), 
     function(index) { 

     # look for change in value of A and B both 
     # if changed then return 1, else return 0 
     !(
      df$ValA[index] == df$ValA[index - 1] & 
       df$ValB[index] == df$ValB[index - 1] 
     ) 

     } 
    ) 
)) 
+0

- それは基本的にValaの1行のValBは、前の行の1に等しいかどうかがわかりますブールベクトルを超える累積和を実行します説明の前の行は第2列のレベルの「ランク」になります。 – DeveauP

+0

Thanks @ TheComeOnMan、あなたの方法は動作します、少し説明できますか? – user2380782

+0

私はコメントを追加しました。あなたが内側から外側に向かって進むなら、あなたは何が起こっているのかを追うことができるはずです。 – TheComeOnMan

関連する問題