2017-11-07 13 views
1

내가하려는 작업을 어떻게 기술해야하는지 잘 모르겠습니다. 두 개의 열 (영화 및 배우)이있는 데이터 프레임이 있습니다. 나는 그들이 함께있는 영화를 기반으로 한 독특한 2 배우 조합의 목록을 만들고 싶습니다. 다음은 내가 가지고있는 데이터 프레임의 예제를 만드는 코드와 내가 원하는 결과 인 다른 데이터 프레임입니다.같은 영화에있는 액터들의 방향이 다른 조합들


start_data <- tibble::tribble(
    ~movie, ~actor, 
    "titanic", "john", 
    "star wars", "john", 
    "baby driver", "john", 
    "shawshank", "billy", 
    "titanic", "billy", 
    "star wars", "sarah", 
    "titanic", "sarah" 
) 

end_data <- tibble::tribble(
    ~movie, ~actor1, ~actor2, 
    "titanic", "john", "billy", 
    "titanic", "john", "sarah", 
    "titanic", "billy", "sarah", 
    "star wars", "john", "sarah" 
) 

어떤 도움 감사합니다, 감사합니다! 보너스 포인트가 짧은 경우 ++

답변

3
당신은 두 개의 열 tibblesummarize으로 목록 컬럼에 저장로 변환 할 수있는 배우의 두 가지 조합을 찾기 위해 combn(..., 2)을 사용할 수 있습니다

; 플랫 데이터 프레임을 얻으려면, unnest를 사용

library(tidyverse) 

start_data %>% 
    group_by(movie) %>% 
    summarise(acts = list(
     if(length(actor) > 1) set_names(as.tibble(t(combn(actor, 2))), c('actor1', 'actor2')) 
     else tibble() 
    )) %>% 
    unnest() 

# A tibble: 4 x 3 
#  movie actor1 actor2 
#  <chr> <chr> <chr> 
#1 star wars john sarah 
#2 titanic john billy 
#3 titanic john sarah 
#4 titanic billy sarah 
+0

이 내가 필요 정확히이다. 내가 만든 유일한 추가 사항은'filter (actor1! = actor2)'를 추가하여 몇 가지 경우를 제거하는 것입니다. 그래도 내 데이터에 문제가있을 수 있습니다. –

+1

각 영화에서 배우가 중복 된 것 같습니다. 필터를 적용한 후에 필터를 적용하거나 처음부터 중복을'combn (unique (actor), 2)'로 제거 할 수 있습니다. – Psidom

2
library(tidyverse) 
library(stringr) 

inner_join(start_data, start_data, by = "movie") %>% 
    filter(actor.x != actor.y) %>% 
    rowwise() %>% 
    mutate(combo = str_c(min(actor.x, actor.y), "_", max(actor.x, actor.y))) %>% 
    ungroup() %>% 
    select(movie, combo) %>% 
    distinct %>% 
    separate(combo, c("actor1", "actor2")) 
+0

다른 포스터와 마찬가지로 효과가있는 것 같습니다. 내 실수는 적절한 샘플 액터 데이터를 제공하지 못하는 것입니다. 형식은 '성 이름'이어야합니다. 방법을 작동 시키려면 약간의 해킹이 필요합니다. 당신의 방법에 대한 또 다른 문제점은 stringr 패키지에서 str_c가 나온다는 것을 언급하지 않았다는 것입니다. 그래도 찾기가 어렵지 않습니다. 노력해 주셔서 감사합니다. –

+1

stringr을 사용하지 않으려면'str_c'를'paste0'로 변경하십시오 –