r-使用purrr::map将tibble中的列表与数据帧合并



我正在使用purrr,并希望使用map或可兼容my_tibble中的列表list1与外部数据帧my_dataframe相结合,其想法是将my_dataframe合并到list1:的每个项

library(dplyr)
library(purrr)
df1 <- tibble(X = 1:3, A = c("a", "b", "c"))
df2 <- tibble(X = 1:3, A = c("d", "e", "f"))
df3 <- tibble(X = 1:3, A = c("x", "y", "z"))
my_tibble <- tibble (list1 = list(df1, df2, df3), list2 = list(df1, df2, df3)) 

my_dataframe <- tibble(D = 1:9, A = c("d", "e", "f","a", "b", "c","x", "y", "z"))
my_tibble <- my_tibble %>% mutate (list1 = map (list1, function (.x) {
.x %>% left_join(my_dataframe) } ))
  • 这个例子确实有效,所以不需要回答

实际上,您需要对my_tibble的每一列进行突变(如果我理解您将my_dataframe更正为left_join。因此,您必须将mutate(across...map一起用作-

my_tibble %>%
mutate(across(everything(), ~map(., function(.x) .x %>% left_join(my_dataframe, by = c('X' = 'D')))))
# A tibble: 3 x 2
list1                list2               
<list>               <list>              
1 <tibble[,3] [3 x 3]> <tibble[,3] [3 x 3]>
2 <tibble[,3] [3 x 3]> <tibble[,3] [3 x 3]>
3 <tibble[,3] [3 x 3]> <tibble[,3] [3 x 3]>

检查

my_tibble %>%
mutate(across(everything(), ~map(., function(.x) .x %>% left_join(my_dataframe, by = c('X' = 'D'))))) -> result
result$list1[[1]]
# A tibble: 3 x 3
X A         D
<int> <chr> <int>
1     1 a         4
2     2 b         5
3     3 c         6

这将作为lambda函数也起作用

my_tibble %>%
mutate(across(everything(), ~map(., ~.x %>% left_join(my_dataframe, by = c('X' = 'D')))))

这也可以在没有purrr包函数的情况下完成,因为它对我来说非常简单,并且认为您可能感兴趣:

library(dplyr)
library(tidyr)

my_tibble %>%
mutate(id = row_number()) %>%
unnest(list1) %>%
left_join(my_dataframe, by = "A") %>%
group_by(id) %>%
nest(data = c(X, A, D)) %>%
rename(list1 = data) %>%
ungroup() %>%
select(-id) %>%
relocate(list1)

# A tibble: 3 x 2
list1            list2           
<list>           <list>          
1 <tibble [3 x 3]> <tibble [3 x 2]>
2 <tibble [3 x 3]> <tibble [3 x 2]>
3 <tibble [3 x 3]> <tibble [3 x 2]>

最新更新