【问题标题】:How to change subsequent row values when a condition is met in a row?连续满足条件时如何更改后续行值?
【发布时间】:2021-01-21 14:26:27
【问题描述】:

只是想知道是否有人知道如何在数据框中满足条件时让 R 更改所有未来的行值?

即假设数据列中有一个负值 - 我希望 R 测试该列的负值和该值以及后续行 0 中的值(无论负值后面的值是否为负)。

非常感谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这不是很优雅,但使用“经典”R 效果很好。如果 x 包含数值:

    f <- function(x) {
      quel <- which(x < 0)[1]
      if(is.na(quel)) return(x)
      x[quel:length(x)] <- 0
      return(x)
    }
    apply(x, 2, f)
    

    例子:

    x <- as.data.frame(matrix(runif(100,-1,1), ncol=10))
    print(x)
    print(apply(x, 2, f))
    

    【讨论】:

      【解决方案2】:

      另一种基本 R 方法可能是使用 cumsum:

      考虑以下data.frame:

      data
         V1 V2
      1   6 19
      2  16  9
      3  -1 14
      4  18 11
      5  19  2
      6   1 18
      7  11 -1
      8  18  1
      9  11  7
      10  9 19
      

      我们可以使用 cumsum 来识别需要替换为0的值:

      sapply(data, function(x){cumsum(x <0) > 0})
              V1    V2
       [1,] FALSE FALSE
       [2,] FALSE FALSE
       [3,]  TRUE FALSE
       [4,]  TRUE FALSE
       [5,]  TRUE FALSE
       [6,]  TRUE FALSE
       [7,]  TRUE  TRUE
       [8,]  TRUE  TRUE
       [9,]  TRUE  TRUE
      [10,]  TRUE  TRUE
      

      从那里很容易:

      sapply(data, function(x){x[cumsum(x <0) > 0] <- 0; x})
            V1 V2
       [1,]  6 19
       [2,] 16  9
       [3,]  0 14
       [4,]  0 11
       [5,]  0  2
       [6,]  0 18
       [7,]  0  0
       [8,]  0  0
       [9,]  0  0
      [10,]  0  0
      

      样本数据:

      set.seed(123)
      data <- as.data.frame(replicate(2,round(runif(0,20,n= 10),0)))
      data[3,1] <- data[7,2] <- -1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        相关资源
        最近更新 更多