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