2016-08-23 3 views
2

예 사이에 새 열 = 차이 : D 자이 두 목록 사이의 차이를 (할당됩니다dplyr ::의 mutate : - 작품이 쉼표로 구분 된 목록 열

df <- data.frame(c0=c(1, 2), c1=c("A,B,C", "D,E,F"), c2=c("B,C", "D,E")) 
df 
# c0 c1 c2 
# 1 1 A,B,C B,C 
# 2 2 D,E,F D,E 

# Add a column d with difference between c1 and c2 
df %>% mutate(d=setdiff(unlist(strsplit(as.character(c1), ",")), unlist(strsplit(as.character(c2), ",")))) 

# c0 c1 c2 d 
# 1 1 A,B,C B,C A 
# 2 2 D,E,F D,E F 

나는 위의 기대 것을 얻을 그들은 이미 분류되어있다). 내가 하나 개 이상의 다른 문자를 소개하면

그러나, 그것은 더 이상 작동하지 않습니다 :

df <- data.frame(c0=c(1, 2), c1=c("A,B,C", "D,E,F,G"), c2=c("B,C", "D,E")) 
df 
# c0  c1 c2 
# 1 1 A,B,C B,C 
# 2 2 D,E,F,G D,E 

# Add a column d with difference between c1 and c2 
df %>% mutate(d=setdiff(unlist(strsplit(as.character(c1), ",")), unlist(strsplit(as.character(c2), ",")))) 
Error: wrong result size (3), expected 2 or 1 

이 내가 얻고 싶었다 무엇 : 나는 setdiff 주위에 paste() 추가하려고했습니다

c0 c1 c2 d 
1 1 A,B,C B,C A 
2 2 D,E,F,G D,E F,G 

그러나 그것은 도움이되지 않았다. 나는 위의 setdiff으로 잘못하고있는 무슨

c0 c1 c2 d 
1 1 A,B,C B,C A 
2 2 D,E,F,G D,E F 
3 2 D,E,F,G D,E G 

: 결국 사실은 아마 같은 새로운 행에 D 열을 분할 tidyr::separate을 사용할 수 있도록하려면?

감사

팀은 2 행에 당신이 셀에 맞지 않을 수 이상의 요소를 가지고 있기 때문에 당신은 오류가

답변

1

, 한 가지 방법은 rowwise를 사용하여 목록으로 결과를 래핑하는 것입니다 있도록 들어갈 수 및 tidyr에서 그 사용 unnest 후 목록 유형 열 확장 :

library(dplyr) 
library(tidyr) 
df %>% 
     rowwise() %>% 
     mutate(d=list(setdiff(unlist(strsplit(as.character(c1), ",")), 
          unlist(strsplit(as.character(c2), ","))))) %>% 
     unnest() 

# Source: local data frame [3 x 4] 

#  c0  c1  c2  d 
# <dbl> <fctr> <fctr> <chr> 
# 1  1 A,B,C B,C  A 
# 2  2 D,E,F,G D,E  F 
# 3  2 D,E,F,G D,E  G 
+0

브릴리언트 - 감사합니다! – Tim

+0

전 행렬을 따라 오지 않았고 전에 불 절한 적이 없습니다. 이해를 확인하려면 : rowwise 후속 요약 및 mutate 작업을 각 행 내에서 수행합니다 (위의 행 붙여 넣기없이 모든 행의 값을 조인 할 때 붙여 넣기를 시도했을 때). unnest는 내가'tidyr :: separate'를 제안한 것을 수행합니다 - d의 각리스트 요소에 대해 행을 복제합니다. 나는이 게시물이 불충분 한 것에 유용하다고 생각했다 : http://bioinfoblog.it/2015/02/the-most-useful-r-command-unnest-from-tidyr/comment-page-1/. Thanks again again @Psidom – Tim

+0

붙여 넣기는 벡터화되어 있기 때문에 실패합니다. 따라서 행 단위로 작업을 제한하는 행 방향이없는 경우 열을 벡터로 처리합니다. 'separate'는 열을 여러 열로 나눌 때 쓰이는 반면,'unnest'는이 경우처럼 각 요소가리스트 인 열을 확장합니다. – Psidom