我正在使用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]>