【问题标题】:Check conditions using the value of a specific column and its previous column by row in R使用 R 中特定列的值及其前一列逐行检查条件
【发布时间】:2018-10-03 11:18:24
【问题描述】:

我正在尝试创建满足给定条件的输出: - 给定列中的值必须为 1 - 上一列的值必须是-1

例如,输入将是:

> cc <- matrix(c(1,-1,NA,-1,1,-1),  nrow=2, byrow = T)
> cc
     [,1] [,2] [,3]
[1,]    1   -1   NA
[2,]   -1    1   -1

我想得到一个与我的输入具有相同尺寸的输出,如果满足上述条件,它将返回“TRUE”;如果条件不满足,则输出应返回 FALSE 或 NA。例如:

> output<- matrix(c(NA,FALSE,NA,NA,TRUE,FALSE), nrow=2, byrow=T)
> output
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE

第一列有 NA,因为我们没有前一列,但它也可以是 FALSE。

【问题讨论】:

  • 嗨,安娜,你到现在为止都尝试过什么?
  • 这是我的第一个也是最简单的猜测:apply(cc, 1, function(x) x==1 & (x-1)==-1)

标签: r conditional-statements multiple-columns


【解决方案1】:

这是获得所需输出的一种方法:

> cbind(NA, cc[, -1, drop = F] == 1 & cc[, -ncol(cc), drop = F] == -1)
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE

apply 不是必需的。 drop = F 用于保持矩阵的形状,以防它只有两列。

另一种方式:

> x <- seq_len(ncol(cc))
> cc[, c(NA, x[-1])] == 1 & cc[, c(NA, head(x, -1))] == -1
     [,1]  [,2]  [,3]
[1,]   NA FALSE    NA
[2,]   NA  TRUE FALSE

【讨论】:

    【解决方案2】:

    创建数据框

    cc <- data.frame(matrix(c(1,-1,NA,-1,1,-1),  nrow=2, byrow = T))
    
    cc
       X1  X2  X3
    1   1  -1  NA
    2  -1   1  -1
    

    遍历数据框,根据上一列的值更改行值

    # Loop starts from the last column
    for(i in length(colnames(cc)):1){
        # Nested loop starts from first row
        for(j in 1:length(rownames(cc))){
            # Check if column is the first
            if(i == 1){
                cc[j,i] <- NA
            }
            # Check for NAs
            else if(is.na(cc[j,i]) | is.na(cc[j,i-1])){
                cc[j,i] <- NA
            }
            # Set to true if condition is met
            else if(cc[j,i] == 1 & cc[j,i-1] == -1){
                cc[j,i] <- TRUE
            } 
            # Else set to false
            else(cc[j,i] <- FALSE)
        }
    }
    

    这显然可以进一步优化,但我尽量让代码保持简单。

    结果

    cc
       X1  X2  X3
    1  NA   0  NA
    2  NA   1   0
    

    说明

    我认为您的方法可能存在逻辑错误。该矩阵不能按顺序(从第 1 列到第 n 列)循环并产生合理的结果。如果您从第 1 列开始并将其设置为 NA(因为它没有前一列),您将得到

         [,1] [,2] [,3]
    [1,]   NA   -1   NA
    [2,]   NA    1   -1
    

    在通过第 2 列的下一个循环中,您将不可避免地得到所有 NAs,因为前一列都是 NA(而不是 -1),依此类推。

         [,1] [,2] [,3]
    [1,]   NA   NA   NA
    [2,]   NA   NA   NA
    

    【讨论】:

    • 感谢罗曼的解释。以后我会用你的例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多