【问题标题】:Use purrr::map to merge list within a tibble with a data frame使用 purrr::map 将 tibble 中的列表与数据框合并
【发布时间】:2021-08-01 22:15:15
【问题描述】:

我正在使用purrr 并希望在一个小标题my_tibble 中使用map 或列表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) } ))
  • 这个例子确实有效,所以不需要回答

【问题讨论】:

  • 请提供一个可重现的例子。
  • 可能很愚蠢,但你为什么不只做一个left_join?您想在 tibble 中嵌入数据框吗?
  • 请发布dput(head(my_tibble))的结果
  • 看看my_tibble$x[[1]] %&gt;% left_join(my_dataframe) 抛出了什么错误。如果它有效,您的第二个 synatx 应该可以工作

标签: r tidyverse purrr tibble


【解决方案1】:

实际上,您需要对my_tibble 的每一列进行变异(如果我理解您正确为left_join 和my_dataframe。所以您必须使用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')))))

【讨论】:

    【解决方案2】:

    这也可以在没有 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]>
    

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      相关资源
      最近更新 更多