替换基于另一列的列中的值,但是遵循第一次替换中的数字索引

时间:2016-04-18 11:11:18

标签: r dataframe

我有一个类似于上面的data.frame。我需要根据第二列的值替换第一列中的值,但是替换需要继续第1列的数值,并且仅在!ValB==A

时替换第1列中的值
>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

我想要的是替换column1中的值,但使用ValB==B作为替换ValA中的值的索引。替换必须继续ValA中的值,即,当1ValB==B ValA必须是5时,2 1}}必须是6,依此类推。请在这里找到所需的输出,这将使我更容易理解我在做什么。我可以使用ifelseif语句执行for循环,但我确信有更简洁的方法,

期望的输出

>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 个答案:

答案 0 :(得分:1)

你可以这样做。它基本上在布尔向量上运行累积和,告诉您一行的ValA和ValB是否等于前一行的ValA和ValB -

# 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]
         )

      }
   )
))