与NA更换到最右边的一排字符串右边

问题描述 投票:0回答:2

我有以下数据帧。我的实际数据集有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
r grep dplyr grepl
2个回答
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
})))

这里的问题是,你失去的日期格式。


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
© www.soinside.com 2019 - 2024. All rights reserved.