1

示例数据

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
4

2 回答 2

3

您需要从变量名称创建一个正则表达式模式。

就像是

or <- function(...) paste0('(', paste(..., sep = '|'), ')')
or(One,Two)
## [1]  '(1|2)'
grep(or(One,Two), colnames(DF))
于 2013-03-21T00:47:38.323 回答
2

尝试使用sapply包裹在c

  c(sapply(One:Two, grep, colnames(DF))

unique如果需要,可能会包裹起来。

--

我发现函数中的参数顺序(与grep函数相反stringr)使得 *apply 调用非常简洁。

于 2013-03-21T00:48:54.033 回答