2013-03-21 78 views
1

示例數據grep的R中具有多個數值或定義的變量

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 

回答

3

你需要創建一個變量名的正則表達式。

喜歡的東西

or <- function(...) paste0('(', paste(..., sep = '|'), ')') 
or(One,Two) 
## [1] '(1|2)' 
grep(or(One,Two), colnames(DF)) 
2

嘗試使用sapply包裹在c

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

,如果需要,也許是包裹在unique

-

我發現,在grep函數的參數順序(相對於stringr功能)就非常整齊*應用調用。