Мои данные выглядят так:
df1
#> Artist Album Year
#> 1 Beatles Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971
и
df2
#> Artist Members
#> 1 Beatles George
#> 2 Beatles Ringo
#> 3 Beatles Paul
#> 4 Beatles John
И я хотел бы присоединиться к этим двум dfs, что я считаю "неопрятным" способом.Несмотря на неопрятность, для меня будет очень полезно, чтобы окончательный результат был похож на пример ниже, где каждая группа (Artist) занимает только одну строку, а все члены группы помещаются в один столбец, разделенные запятыми:
Desired Output
#> Artist Album Members Year
#> 1 Beatles Sgt. Pepper's George, Ringo, Paul, John 1967
#> 2 Rolling Stones Sticky Fingers 1971
Мне удалось приблизиться к решению (ниже), но:
- Есть ли более простой способ сделать это?
- Как я могу обобщить мой код так, чтобы, если есть группа с, скажем, 11 участниками или 13 участниками, код все еще работал?
- Когда данные отсутствуют, как для Rolling Stones, значения равны "NA».Легко ли сделать их пустыми?
library(tidyverse)
df1 <- data.frame(stringsAsFactors=FALSE,
Artist = c("Beatles", "Rolling Stones"),
Album = c("Sgt. Pepper's", "Sticky Fingers"),
Year = c(1967, 1971)
)
df2 <- data.frame(stringsAsFactors=FALSE,
Artist = c("Beatles", "Beatles", "Beatles", "Beatles"),
Members = c("George", "Ringo", "Paul", "John")
)
df <- left_join(df1, df2, by = "Artist")
df <- df %>% group_by(Artist) %>% mutate(member_number = seq_along(Members))
df <- spread(df, key = "member_number", value = "Members", sep = "_")
df <- df %>% unite(col = "members", member_number_1:member_number_4, sep = ",")
Что дает вывод
df
#> # A tibble: 2 x 4
#> # Groups: Artist [2]
#> Artist Album Year members
#> <chr> <chr> <dbl> <chr>
#> 1 Beatles Sgt. Pepper's 1967 George,Ringo,Paul,John
#> 2 Rolling Stones Sticky Fingers 1971 NA,NA,NA,NA