2017-09-19 11 views
0

보다, 여러 문자열의 grepl 경기에서 일치하는 문자열을 반환 :예를 들어, 현재 내가 데이터 프레임 문자열의 벡터에 일치를 확인하기 위해 grepl와 중첩 ifelse 기능을 사용하고 오히려 논리적

# vector of possible words to match 
x <- c("Action", "Adventure", "Animation") 

# data 
my_text <- c("This one has Animation.", "This has none.", "Here is Adventure.") 
my_text <- as.data.frame(my_text) 

my_text$new_column <- ifelse (
    grepl("Action", my_text$my_text) == TRUE, 
    "Action", 
    ifelse (
    grepl("Adventure", my_text$my_text) == TRUE, 
    "Adventure", 
    ifelse (
     grepl("Animation", my_text$my_text) == TRUE, 
     "Animation", NA))) 

> my_text$new_column 
[1] "Animation" NA   "Adventure" 

몇 가지 요소 (예 : 여기의 3 개)에 대해서는 문제가 없지만 가능한 일치 항목이 훨씬 더 큰 경우 (예 : 150) 어떻게 반환합니까? 중첩 된 ifelse 미친 것 같습니다. 아래 코드와 같이 한 번에 여러 항목을 grepl 할 수 있다는 것을 알고 있지만이 문자열은 일치하는 문자열이 아닌 일치하는 문자열 만 반환한다는 논리를 반환합니다. 나는 경기 중 하나가 괜찮 다수의 경우 (일치 있었는지 알고 싶습니다.

x <- c("Action", "Adventure", "Animation") 
my_text <- c("This one has Animation.", "This has none.", "Here is Adventure.") 
grepl(paste(x, collapse = "|"), my_text) 

returns: [1] TRUE FALSE TRUE 
what i'd like it to return: "Animation" ""(or FALSE) "Adventure" 

답변

1

을 패턴 here하는 base 솔루션에 따라.

x <- c("ActionABC", "AdventureDEF", "AnimationGHI") 

regmatches(x, regexpr("(Action|Adventure|Animation)", x)) 

stringr가 쉽게있다 이것은 그것을 할 것이

library(stringr) 
str_extract(x, "(Action|Adventure|Animation)") 
0

을 할 수있는 방법 ...

my_text$new_column <- unlist(    
         apply(   
          sapply(x, grepl, my_text$my_text), 
          1, 
          function(y) paste("",x[y]))) 

sapply은 열의 각 요소에 나타나는 x 용어를 나타내는 논리 행렬을 생성합니다. 그러면 apply은이 행 단위로 실행되어 TRUE 값에 해당하는 x의 모든 값을 붙여 넣습니다. (시작 부분에 ""을 붙이면 NA을 피하고 출력 길이를 원본 데이터와 동일하게 유지합니다. x에 두 조건이 일치하면 결과가 함께 출력됩니다.

2

Benjamin의 기본 솔루션을 사용하여 lapply를 사용하면 일치하는 항목이 없을 때 문자 (0) 값을 갖게됩니다.

예제 코드에서 직접 regmatches를 사용하면 다음 오류가 발생합니까?

my_text$new_column <-regmatches(x = my_text$my_text, m = regexpr(pattern = paste(x, collapse = "|"), text = my_text$my_text)) 

    Error in `$<-.data.frame`(`*tmp*`, new_column, value = c("Animation", : 
    replacement has 2 rows, data has 3 

이것은 일치 항목이 두 개뿐이며 일치 값을 3 행을 갖는 데이터 프레임 열에 맞추려고 시도하기 때문입니다.

불일치를 특별한 값으로 채우기 위해이 작업을 직접 수행 할 수 있도록 lapply를 사용할 수 있습니다.

my_text$new_column <- 
lapply(X = my_text$my_text, FUN = function(X){ 
    regmatches(x = X, m = regexpr(pattern = paste(x, collapse = "|"), text = X)) 
}) 

일치하는 부분에 문자 (0)를 넣습니다. 이 도움이

Table screenshot

희망.