2017-11-07 4 views
1

私がやろうとしている操作をどのように記述するのか正確にはわかりません。私は2つの列(ムービーとアクター)を持つデータフレームを持っています。私は彼らが一緒にいる映画に基づいて、これからユニークな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

短くなっている場合には、2つの列tibbleに変換し、summarizeとリスト列に格納できる俳優、二組み合わせを見つけるために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

これは他のポスターと同様に機能するようです。私の間違いは、適切なサンプルアクターデータを提供していないことでした。書式は '姓名 'でなければなりません。あなたのメソッドを動作させるには、ちょっとしたハッキン​​グが必要です。あなたのメソッドのもう一つの問題は、str_cがstringrパッケージから来ていることに言及しなかったことです。しかし、見つけるのは難しいことではありません。お疲れ様でした。 –

+1

stringrを使いたくない場合は 'str_c'を' paste0'に変更してください –

関連する問題