2016-07-27 5 views
1

의 벡터에 의한 data.table이 데이터 테이블 X를 가지고 :일부에 우리 가정 문자열

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)) 

나는 어떤 문자열하여 부분 집합 싶다.

X[like(H,pattern = "g")] 
: data.table 패키지를 사용하여, How to select R data.table rows based on substring match (a la SQL like)

우리는 g을 원하는 경우 : 여기, 우리는 열 여기 H

g, Fd를 취할 것입니다, 우리는 하나 개의 문자열이 작업을 수행 할 수있는 솔루션을 가지고

하지만 내 문제는 g, Fd에 대해 한번 복제하는 것입니다.

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 당신 말이 맞아요. 내 문제입니다. 나는이 작업을 위해 벡터를 취할 수있는 기능을 모른다. Btw, 도와 줘서 고마워. –

답변

4

우리는 |로 보내고 collapse하여 하나의 문자열로 vector을 보내고 paste하여 grep를 사용할 수 있습니다.

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

아니면

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

'like'는 후드 아래에서'grepl'을 사용하고 있습니다.'paste' 메소드는'like'의'pattern' 인수에서도 작동해야한다고 가정합니다 – Tensibai

1

나는 당신이 사용할 수 있다고 생각합니다 (@Tensibal에 의해 제안) |하여 pattern 벡터 collapse D를 보내고 paste하여 동일한 접근 방식을 사용할 수 있습니다

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