代码之家  ›  专栏  ›  技术社区  ›  nak5120

替换为最右侧行字符串右侧的NA

  •  0
  • nak5120  · 技术社区  · 7 年前

    我在下面有一个数据框。我的实际数据集有800列。

    最右边的 包含字符串的列 abc ,我想使该行中的每个值 正当 那个专栏的 NA .

    col1 <- as.Date(c('2019-01-01', '2019-01-02', '2019-02-01', '2019-03-01', '09-02-18'))
    col2 <- c('jkabc', 'abckee', 'kekdm', 'oeoeo', 'mends')
    col3 <- as.Date(c('2019-08-02', '2019-08-01', '2019-08-04', '2019-07-02', '09-03-15'))
    col4 <- c('nnnnn', 'kndabc_kd', 'kenabc123', 'werc', 'mendiabc')
    col5 <- as.Date(c('2019-12-11', '2019-11-22', '2019-06-12', '2019-09-30', '08-04-18'))
    col6 <- c('nnnnn', 'kdekd', 'abc14', 'ekmabckem', 'nekm')
    
    df<-data.frame(col1, col2, col3, col4, col5, col6)
    
    df
    
            col1   col2       col3      col4       col5      col6
    1 2019-01-01  jkabc 2019-08-02     nnnnn 2019-12-11     nnnnn
    2 2019-01-02 abckee 2019-08-01 kndabc_kd 2019-11-22     kdekd
    3 2019-02-01  kekdm 2019-08-04 kenabc123 2019-06-12     abc14
    4 2019-03-01  oeoeo 2019-07-02      werc 2019-09-30 ekmabckem
    5 0009-02-18  mends 0009-03-15  mendiabc 0008-04-18      nekm
    

    在某些实例中,列包含和不包含字符串 abc

            col1   col2       col3      col4       col5      col6
    1 2019-01-01  jkabc         NA        NA         NA        NA
    2 2019-01-02 abckee 2019-08-01 kndabc_kd         NA        NA
    3 2019-02-01  kekdm 2019-08-04 kenabc123 2019-06-12     abc14
    4 2019-03-01  oeoeo 2019-07-02      werc 2019-09-30 ekmabckem
    5 0009-02-18  mends 0009-03-15  mendiabc         NA        NA
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Adam Waring    7 年前

    这是一个非常丑陋的解决方案。

    df = data.frame(t(apply(df, 1, function(x){
      index = grep("abc", x)
      index = index[length(index)]
      if(index > 0){
        if(index != length(x))
        x[(index + 1):length(x)] = NA
      }
    x
    })))
    

    这里的问题是您丢失了日期格式。

        2
  •  0
  •   Nick Kennedy    7 年前

    这里有一个解决方案,它创建一个逻辑矩阵,将其中的单元格设置为NA,然后执行此操作。

    abc <- grepl("abc", as.matrix(dm))
    dim(abc) <- dim(df)
    abc <- t(apply(abc, 1, function(x) {
      if (any(x)) {
        min_abc <- min(which(x))
        rep(c(FALSE, TRUE), c(min_abc, length(x) - min_abc))
      } else {
        x
      }
    }))
    df[abc] <- NA
    df