соединение фрейма данных с вложенными фреймами данных в purrr :: map_ * - PullRequest
0 голосов
/ 02 мая 2018

Моя цель - присоединить фрейм данных к фреймам данных, хранящимся во вложенном столбце списка, например:

data(mtcars)
library(tidyr)
library(purrr)

mtcars_nest <- mtcars %>% rownames_to_column() %>% rename(rowname_1 = rowname) %>% select(-mpg) %>% group_by(cyl) %>% nest()
mtcars_mpg <- mtcars %>% rownames_to_column() %>% rename(rowname_2 = rowname) %>% select(rowname_2, mpg)

join_df <- function(df_nest, df_other) {
  df_all <- df_nest %>% inner_join(df_other, by = c("rowname_1" = "rowname_2"))
}

join_df <- mtcars_nest %>%
  mutate(new_mpg = map_df(data, join_df(., mtcars_mpg)))

Возвращает следующую ошибку:

# Error in mutate_impl(.data, dots) : Evaluation error: `by` can't contain join column `rowname_1` which is missing from LHS.

Таким образом, фрейм данных map_*, полученный от вложенного ввода, не предлагает имя столбца (т. Е. rowname_1) для участия в объединении. Я не могу понять, почему это так. Я передаю столбец data, который содержит кадры данных из вложенного кадра данных. Я хочу вывод данных из фрейма, который можно добавить в новый столбец во входном фрейме данных, например

| rowname_1 | cyl | disp |...|mpg|
|:----------|:----|:-----|:--|:--|

1 Ответ

0 голосов
/ 02 мая 2018

Пара вещей:

  • Вы должны использовать тильду, чтобы функционализировать (в purrr) аргумент функции в map*; и
  • Я думаю, вы должны использовать map вместо map_df, и хотя я не могу точно найти , почему map_df не работает правильно, я могу получить то, что я считаю желаемым вами поведением без него.

Малая точка:

  • вы присваиваете df_all в пределах join_df(), и единственная причина, по которой он работает, заключается в том, что это назначение невидимо возвращает то, что вы присвоили df_all; Я полагаю, что вы должны быть явными: либо следите за return(df_all), либо просто не назначайте его, заканчивайте inner_join(...).

Попробуйте это:

library(tibble) # rownames_to_column
library(dplyr)
library(tidyr)  # nest
library(purrr)

join_df <- function(df_nest, df_other) {
  df_all <- inner_join(df_nest, df_other, by = c("rowname_1" = "rowname_2"))
  return(df_all)
}

mtcars_nest %>%
  mutate(new_mpg = map(data, ~ join_df(., mtcars_mpg)))
# # A tibble: 3 x 3
#     cyl data               new_mpg           
#   <dbl> <list>             <list>            
# 1    6. <tibble [7 x 10]>  <tibble [7 x 11]> 
# 2    4. <tibble [11 x 10]> <tibble [11 x 11]>
# 3    8. <tibble [14 x 10]> <tibble [14 x 11]>

new_mpg - это столбец data с одним дополнительным столбцом. Поскольку мы знаем, что у нас полная избыточность, вы всегда можете перезаписать (или удалить) data:

mtcars_nest %>%
  mutate(data = map(data, ~ join_df(., mtcars_mpg)))
# # A tibble: 3 x 2
#     cyl data              
#   <dbl> <list>            
# 1    6. <tibble [7 x 11]> 
# 2    4. <tibble [11 x 11]>
# 3    8. <tibble [14 x 11]>

и получите свои вложенные и теперь дополненные кадры.

...