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

Replace with NA to the right of rightmost row string

我在下面有一个数据框。我的实际数据集有 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

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

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
})))

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

这是一个解决方案,它创建一个逻辑矩阵,其中的单元格设置为 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