R объединить два кадра данных на основе столбца и списка - PullRequest
0 голосов
/ 17 февраля 2019

Есть ли в любом случае, я могу объединить два кадра данных в R на основе столбца, который находится в форме списка, чтобы получить сумму другого столбца.Некоторые примеры данных ниже:

df1 <- structure(list(id = c("1", "2"), 
                      band = list(c("c1", "c2", "c3"), "c4"), 
                      samples = list(c(32, 2, 61), 20), 
                      time = list(c(307, 2, 238), 74)), 
                 .Names = c("id", "band", "samples", "time"), 
                 row.names = 0:1, class = "data.frame")

enter image description here

df2 <- structure(list(id = c("1", "3"), 
                      band = list(c("c1", "c4"), "c1"), 
                      samples = list(c(1, 2), 2), 
                      time = list(c(4, 2), 7)), 
                 .Names = c("id", "band", "samples", "time"), 
                 row.names = 0:1, class = "data.frame")

enter image description here

Я быхотел бы получить данные слияния из df1 и df2 на основе столбца id и band.К сожалению, столбец полос находится в форме списка, и мне нужно суммировать выборки и столбец времени на основе элементов из столбца полос, который находится в списке из.Я ожидаю ниже

enter code here

1 Ответ

0 голосов
/ 17 февраля 2019

Одним из решений является использование unnest пакета tidyr и bind_rows в сочетании с group_by и summarize из dplyr.

library(tidyr)
library(dplyr)

unnestзаботится о столбце списка:

df1_unnest <- df1 %>% 
  unnest()

df1_unnest
#   id band samples time
# 1  1   c1      32  307
# 2  1   c2       2    2
# 3  1   c3      61  238
# 4  2   c4      20   74

df2_unnest <- df2 %>% 
  unnest()

bind_rows объединяет два новых data.frames:

new_df <- bind_rows(df1_unnest, df2_unnest)

new_df
#   id band samples time
# 1  1   c1      32  307
# 2  1   c2       2    2
# 3  1   c3      61  238
# 4  2   c4      20   74
# 5  1   c1       1    4
# 6  1   c4       2    2
# 7  3   c1       2    7

Затем с group_by и summarize_all вы можете суммировать значениядля id 1, диапазон c1:

new_df <- new_df %>% 
  group_by(id, band) %>% 
  summarize_all(sum)

new_df
# A tibble: 6 x 4
# Groups:   id [?]
#   id    band  samples  time
#   <chr> <chr>   <dbl> <dbl>
# 1 1     c1         33   311
# 2 1     c2          2     2
# 3 1     c3         61   238
# 4 1     c4          2     2
# 5 2     c4         20    74
# 6 3     c1          2     7

Если вам нужны столбцы списка, вы можете сделать

new_df_list <- new_df %>%
  group_by(id) %>% 
  summarize_all(list)

print.data.frame(new_df_list)
#   id           band      samples           time
# 1  1 c1, c2, c3, c4 33, 2, 61, 2 311, 2, 238, 2
# 2  2             c4           20             74
# 3  3             c1            2              7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...