2017-02-17 9 views
0

이 dataframe 열 사이에 공유 예 :찾기 문자열은 내가 구분 된 문자열의 두 열 데이터 프레임을 가지고

  a  b  c 
1 a, b, c, d a, d a, d 
2  a, c  a  a 
3  b, d a, d  d 

문자열을 목록으로 변환하고 뒤로 가져 오는 것과 관련된 여러 가지 방법을 시도했지만 올바른 결과를 얻을 수없는 것 같습니다. 오류를 초래

df <- df %>% 
    mutate(c=paste(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", ")))))) 

:

Error in eval(substitute(expr), envir, enclos) : wrong result size (2), expected 3 or 1

뿐만 아니라 필요한 문자열을 반환하지가,이 같은 결과를 반환하는 것 dplyr를 사용

은 내가 먼저 사용하려고 위의 mutate 기능을 아래의 paste에서 length으로 변경하여 확인한 각 행의 크기 :

df %>% 
    mutate(c=length(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", ")))))) 

      a b c 
1 a, b, c, d a, d 2 
2  a, c a 2 
3  b, d a, d 2 

내 모든 행 결과가 하나의 결과로 결합되어 반복되는 것에 대해 걱정이됩니다.

인터 섹트 기능을 사용하기 전에이 목록에 내 문자열을 변환하려고 일을 단순화하려고합니다 :

df %>% mutate(a_list=list(unlist(strsplit(a, split=", ")))) 

을하지만 오류 접수 :

Error in eval(substitute(expr), envir, enclos) : not compatible with STRSXP

궁금하게하는 경우 데이터 프레임의 목록 tidyverse과 호환되며 완전히 다른 접근 방식을 취할 필요가있는 경우

R의 두 데이터 프레임 열 (데이터 프레임의 목록 같은 값을 처리하는 방법에 대한 통찰력) 사이에서 공유되는 문자열을 찾는 문제에 접근하는 방법에 대한 조언은 감사하게 받아 들여집니다.

답변

1

이 기본 R 방법은 작동합니다. strsplit을 사용하여 변수를 각 요소가있는 문자 벡터가있는 목록으로 분할합니다. mapply 함수는 목록을 가져와 같은 위치에있는 각 목록의 요소 쌍에 다음 작업을 적용합니다. 그런 다음 겹치는 요소를 찾으려면 insersect을 사용하고 붕괴가있는 경우 paste을 사용하여 붙여 넣습니다.

df$c <- mapply(function(x, y) paste(intersect(x, y), collapse=", "), 
       strsplit(df$a, ", "), strsplit(df$b, ", ")) 

df 
      a b c 
1 a, b, c, d a, d a, d 
2  a, c a a 
3  b, d a, d d 

데이터

df <- data.frame('a'=c('a, b, c, d', 'a, c', 'b, d'), 
       'b'=c('a, d', 'a', 'a, d'), stringsAsFactors=FALSE) 
+0

, 덕분에, 나는 아마 dplyr 사용 싶어 조금 넘는이었다. – MrGraeme

0

당신은 시도 할 수 있습니다 :

위대한
library(stringr) 
# go go through each row, extract the letters, search for duplicates and paste together 
apply(df, 1, function(x){ 
    tmp <- str_trim(unlist(str_split(x,","))) 
    paste(tmp[duplicated(tmp)],collapse=", ") 
}) 
[1] "a, d" "a" "d"