【问题标题】:purrr::map() a deeply nested list to test for equality of dataframespurrr::map() 一个深度嵌套的列表,用于测试数据帧的相等性
【发布时间】:2020-11-03 00:19:09
【问题描述】:

问题

我有一个包含嵌套列表集的列表。我需要测试最低级别的所有数据帧是否相等,并且在执行此测试时需要尊重数据的分组。

我正在尝试使用 purrr::map() 解决问题,但我很难理解如何迭代每个子列表。

我在这个例子中使用了gapminder,只是因为它可以嵌套两次,这与我的实际数据相同(我不能在这里分享)。

数据

library(dplyr)
library(gapminder)
library(purrr)

tf <- gapminder %>% 
  select(continent, country, year) %>% 
  group_by(continent, year) %>% 
  nest() %>% 
  arrange(desc(year)) %>% 
  ungroup() %>% 
  group_by(year) %>% 
  nest()

我的尝试

tf$data[[1]] 包含每个大陆的数据列表。我需要检查这些列表是否相等。此数据集在此级别生成不相等的列表,但这没关系,我只需要我的实际数据的模式。

我的尝试只允许我遍历底层的一个列表。

map_chr(tf$data[[1]]$data, all_equal, current = tf$data[[1]]$data[[1]])

我需要对底层的所有列表执行此操作:对于 tf 中的每一年、tf$data 中的每个列表、tf$data[[1]] 中的每个大陆、tf$data[[1]]$data 中的每个列表,比较是否第一个列表tf$data[[1]]$data[[1]] 等于该级别的其他列表。

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    为什么不将列表取消嵌套一层?然后你可以使用dplyr 提供的所有东西,比如分组mutate

    tf %>%
      unnest(data) %>%
      mutate(equal_to_first = map_chr(data, all_equal, current = data[[1]])) %>%
      unnest(equal_to_first)
    

    结果:

    # A tibble: 60 x 4
    # Groups:   year [12]
        year continent data              equal_to_first          
       <int> <fct>     <list>            <chr>                   
     1  2007 Asia      <tibble [33 × 1]> TRUE                    
     2  2007 Europe    <tibble [30 × 1]> Different number of rows
     3  2007 Africa    <tibble [52 × 1]> Different number of rows
     4  2007 Americas  <tibble [25 × 1]> Different number of rows
     5  2007 Oceania   <tibble [2 × 1]>  Different number of rows
     6  2002 Asia      <tibble [33 × 1]> TRUE                    
     7  2002 Europe    <tibble [30 × 1]> Different number of rows
     8  2002 Africa    <tibble [52 × 1]> Different number of rows
     9  2002 Americas  <tibble [25 × 1]> Different number of rows
    10  2002 Oceania   <tibble [2 × 1]>  Different number of rows
    # … with 50 more rows
    

    如果您想恢复原来的结构,只需再次nest 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2018-10-11
      • 2017-04-11
      相关资源
      最近更新 更多