将数据帧连接到purrr :: map_ *中的嵌套数据帧

时间:2018-05-01 23:08:26

标签: r tidyr purrr

我的目标是将数据框连接到嵌套列表列中的数据框,例如:

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 :(得分:4)

一些事情:

  • 你应该使用代字号来函数化(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]>

并获取嵌套和现在增强的帧。