簡體   English   中英

purrr::map() 一個深度嵌套的列表,用於測試數據幀的相等性

[英]purrr::map() a deeply nested list to test for equality of dataframes

問題

我有一個包含嵌套列表集的列表。 我需要測試最低級別中的所有數據幀是否相等,並且在進行此測試時我需要尊重數據的分組。

我正在嘗試使用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]]是否等於該級別的其他列表。

為什么不將列表取消一級? 然后您可以使用dplyr提供的所有dplyr ,例如 group-wise 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結果即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM