我有以下数据帧。我的实际数据集有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