将数据框加入 purrr::map_* 内的嵌套数据框
joining dataframe to nested dataframes within purrr::map_*
我的目标是将数据框连接到嵌套列表列中的数据框,例如:
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)))
此returns以下错误:
# 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|
|:----------|:----|:-----|:--|:--|
几件事:
- 您应该使用波浪号来函数化(在
purrr
中)map*
的函数参数;和
- 我认为你应该使用
map
而不是 map_df
,虽然我找不到确切的 为什么 map_df
不起作用是的,没有它我可以得到我认为是你想要的行为。
要点:
- 您在
join_df()
内分配给 df_all
,它起作用的唯一原因是因为该分配无形地 returns 您分配给 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]>
并获取嵌套的和现在增强的框架。
我的目标是将数据框连接到嵌套列表列中的数据框,例如:
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)))
此returns以下错误:
# 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|
|:----------|:----|:-----|:--|:--|
几件事:
- 您应该使用波浪号来函数化(在
purrr
中)map*
的函数参数;和 - 我认为你应该使用
map
而不是map_df
,虽然我找不到确切的 为什么map_df
不起作用是的,没有它我可以得到我认为是你想要的行为。
要点:
- 您在
join_df()
内分配给df_all
,它起作用的唯一原因是因为该分配无形地 returns 您分配给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]>
并获取嵌套的和现在增强的框架。