R中的grep具有多个数字或定义的变量

时间:2013-03-21 00:34:49

标签: regex r grep

示例数据

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

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调用。