【问题标题】:Conditionally replace columns with NA [duplicate]有条件地用 NA 替换列 [重复]
【发布时间】:2020-08-25 00:36:35
【问题描述】:

这是我的数据示例:

m <- data.frame(swim = c(0,1,0,0), time1 = c(1,2,3,4), time2 = c(2,3,4,5))

我想在m$swim 中有1 的行之后用NA 替换列time1 和time2 中的所有数字。它应该是这样的:

n <- data.frame(swim = c(0,1,0,0), time1 = c(1,2,NA,NA), time2 = c(2,3,NA,NA))

Thank you!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    dplyr 你可以这样做:

    library(dplyr)
    m %>%
      mutate(across(starts_with('time'), 
               ~replace(., row_number() > match(1, swim), NA)))
    

    然而,一个基本的 R 选项会更有效。

    cols <- grep('time', names(m))
    inds <- match(1, m$swim)
    m[(inds + 1):nrow(m), cols] <- NA
    m
    #  swim time1 time2
    #1    0     1     2
    #2    1     2     3
    #3    0    NA    NA
    #4    0    NA    NA
    

    【讨论】:

    • dplyr 解决方案效果很好。注意:您需要 dplyr 1.0.0 或更高版本才能使用新的 cross() 函数
    【解决方案2】:

    base R 的解决方案是:

    #Data
    m <- data.frame(swim = c(0,1,0,0), time1 = c(1,2,3,4), time2 = c(2,3,4,5))
    #Detect position
    index <- min(which(m$swim==1)) 
    #Replace
    m[(index+1):dim(m)[1],-1] <- NA
    

    输出:

      swim time1 time2
    1    0     1     2
    2    1     2     3
    3    0    NA    NA
    4    0    NA    NA
    

    【讨论】:

      【解决方案3】:

      使用data.table,结果如下:

      library(data.table)
      setDT(m)
      
      #Start after the row with the 1
      stop.here <- which(m$swim == 1)+1
      
      these_rows <- seq(stop.here,length(m$swim),1)
      
      m <- m[these_rows,time1:=NA]
      m <- m[these_rows,time2:=NA]
      

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2016-08-29
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2019-06-10
        • 2020-03-14
        相关资源
        最近更新 更多