用最右边的行字符串右边的NA替换

时间:2019-02-06 23:01:15

标签: r grep dplyr grepl

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

对于包含字符串abc最右列,我想将该行中的每个值都设为该列NA right

这里是一个示例:

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 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

这是一个解决方案,它创建一个逻辑矩阵,然后将要设置为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