示例数据
A<-c(1,4,5,6)
B<-c(4,6,7,8)
C<-c(6,9,1,2)
D<-c(5,6,7,3)
E<-c(10,11,12,19)
DF<-data.frame(A,B,C,D,E)
colnames(DF)<-c("A_1","B_1","C_2","D_2","TEST")
One<-1
Two<-2
我想根据最后一栏中的条件使用grep来删除(生成NA)我的数据。
DF[DF$TEST>15,grep(Two,colnames(DF))]<-NA
工作得很好
DF[DF$TEST>15,grep(Two|One,colnames(DF))]<-NA
不
以防数值数据略有不同
DF[DF$TEST>15,grep(2,colnames(DF))]<-NA
这很好用
DF[DF$TEST>15,grep(2|1,colnames(DF))]<-NA
这不是
理想情况下,我希望能够使用grep根据几个每个定义的变量删除数据:
grep(One|Two|Three|Four)
或处理数字
grep(1:4)
而且我不确定我是否可以在正则表达式中使用添加功能,但最终如果我能做到这一点最简单:
DF[DF$TEST>15,grep(One+1,colnames(DF))]<-NA #If I were trying to grep on 2
或
DF[DF$TEST>15,grep(One+1:One,colnames(DF))]<-NA #If I were trying to grep on 1:2
答案 0 :(得分:3)
您需要从变量名称创建正则表达式模式。
像
这样的东西or <- function(...) paste0('(', paste(..., sep = '|'), ')')
or(One,Two)
## [1] '(1|2)'
grep(or(One,Two), colnames(DF))
答案 1 :(得分:2)
尝试使用sapply
c
c(sapply(One:Two, grep, colnames(DF))
如果需要,可能还包含在unique
中。
-
我发现grep
函数中的参数顺序(与stringr
函数相对)使得非常简洁的* apply调用。