在新列中进行行比较和更新

时间:2017-10-13 04:00:17

标签: r

我想根据col.b向数据帧(df)添加第三列 和行明智的比较。我希望col.c每行增加一个,除非col.b中的元素低于0.1。如果是这种情况,则col.c中的值应与col.c中的前一个值相同。

df    <-structure(list(col.a = c(1, 2, 3, 4, 5, 6, 7, 8, 
        9, 10), col.b = c(0.176776695296637, 0.166666666666667, 
         0.171692917879238, 0.247435829652697, 0.0909090909090909, 
         0.244948974278318, 0.142857142857143, 0.072005229038445, 
         0.202030508910442, 0.248451997499977)), .Names = c("col.a", 
        "col.b"), row.names = c(NA, -10L), class = "data.frame")

> df
  col.a           col.b   
      1  0.176776695296637
      2  0.166666666666667
      3  0.171692917879238
      4  0.247435829652697
      5 0.0909090909090909
      6  0.244948974278318
      7  0.142857142857143
      8  0.072005229038445
      9  0.202030508910442
     10  0.248451997499977`

期望的输出

> df
  col.a           col.b       col.c
      1  0.176776695296637    1
      2  0.166666666666667    2
      3  0.171692917879238    3
      4  0.247435829652697    4
      5 0.0909090909090909    4
      6  0.244948974278318    5
      7  0.142857142857143    6 
      8  0.072005229038445    6
      9  0.202030508910442    7
     10  0.248451997499977    8

到目前为止,我想出了一个循环,但是计数已关闭,当用于我的大型数据帧时,它变得非常慢

for (i in 1:nrow(df)){
   ifelse(df$col.b[i] >0.1 ,m <- df$col.a[i], m <-df$col.a[i-1])          
   df$col.c[i] <- m   }

我寻找更快的方法来实现这一点。

1 个答案:

答案 0 :(得分:1)

我们需要在逻辑cumsum

上执行vector
with(df, cumsum(col.b > 0.1))
#[1] 1 2 3 4 4 5 6 6 7 8