2016-07-27 68 views
1

假設我們的矢量得到這個數據表X子集的data.table由子

Random <- function(n=1, lenght=6){ 
    randomString <- c(1:n) 
    for (i in 1:n){randomString[i] <- paste(sample(c(0:9, letters, LETTERS), 
            lenght, replace=TRUE),collapse="")} 
    return(randomString)} 

X <- data.table(A = rnorm(11000, sd = 0.8), 
       B = rnorm(11000, mean = 10, sd = 3), 
       C = sample(LETTERS[1:24], 11000, replace=TRUE), 
       D = sample(letters[1:24], 11000, replace=TRUE), 
       E = round(rnorm(11000,mean=25, sd=3)), 
       F = round(runif(n = 11000,min = 1000,max = 25000)), 
       G = round(runif(11000,0,200000)), 
       H = Random(11000)) 

我想通過一些子串子集它。在這裏,我們將採取gFdH

在這裏,我們得到了一個解決方案,爲一個子做到這一點:How to select R data.table rows based on substring match (a la SQL like)

如果我們只希望g,使用data.table包:

X[like(H,pattern = "g")] 

但我的問題是在單個操作中複製gFd

Vec <- c("g","F","d") 
Newtable <- X[like(H,pattern = Vec)] 
Warning message: 
In grep(pattern, levels(vector)) : 
    argument 'pattern' has length > 1 and only the first element will be used 

有沒有辦法做到這一點,沒有創建3個表,合併它們並刪除重複?

+0

我覺得'like'只會取一個元素而不是一個向量。嘗試使用'Vectorize' – akrun

+0

@Akrun你是對的,這是我的問題。我不知道任何能夠爲此操作獲取矢量的函數。順便說一句,感謝您的幫助。 –

回答

4

我們可以使用greppaste通過collapsevector合併成單個字符串|

X[grep(paste(Vec, collapse="|"), H)] 

或者我們可以paste使用相同的方法由荷蘭國際集團|pattern矢量collapse d(由@Tensibal的建議)

X[like(H, pattern = paste(Vec, collapse="|"))] 
+3

'like'在引擎蓋下使用'grepl',我假設'paste'方法應該可以像''''pattern'參數一樣工作 – Tensibai

1

我想你也可以使用此:

NewTable <- X[grepl("g",H) | grepl("F",H) | grepl("d",H)]