Тестирование равенства столбцов со списком-столбцами или вложенными data.frame - PullRequest
0 голосов
/ 20 мая 2019

Tibbles (из tidyverse) могут содержать список-столбцы, которые полезно содержать, например. вложенные фреймы данных или объекты, традиционно не встречающиеся в data.frame.

Вот пример:

library("dplyr")

nested_df <-
      iris %>%
      group_by(Species) %>%
      tidyr::nest() %>%
      mutate(model = purrr::map(data, lm, formula = Sepal.Length ~ .))

nested_df
#  # A tibble: 3 x 3
#   Species    data              model   
#   <fct>      <list>            <list>  
# 1 setosa     <tibble [50 × 4]> <S3: lm>
# 2 versicolor <tibble [50 × 4]> <S3: lm>
# 3 virginica  <tibble [50 × 4]> <S3: lm>

Я пишу несколько тестов с testthat: как проверить равенство между такими фреймами данных?

testthat::expect_equal не работает, потому что all.equal и dplyr::all_equal оба не работают:

all.equal(nested_df, nested_df)
# Error in equal_data_frame(target, current, ignore_col_order = ignore_col_order,  : 
#  Can't join on 'data' x 'data' because of incompatible types (list / list)

Я подумал об использовании testthat::expect_true(identical(...)), но это часто слишком строго. Например, определения одинакового nested_df2 недостаточно для передачи identical, поскольку атрибут .Environment terms, встроенный в модель lm, отличается, хотя модели равны и передают all.equal.

identical(nested_df, nested_df2)
# [1] FALSE
identical(nested_df$model, nested_df2$model, ignore.environment = TRUE)
# [1] FALSE
all.equal(nested_df$model, nested_df2$model, tolerance = 0)
# [1] TRUE

Как я могу проверить равенство столбцов со списком столбцов, таких как nested_df?

1 Ответ

1 голос
/ 20 мая 2019

Каким-то тупым подходом, но, похоже, работает на вашем примере:

all.equal.list(nested_df, nested_df)

# [1] TRUE

all.equal.list(nested_df, mutate(nested_df, Species = sample(Species)))

# [1] "Component “Species”: 2 string mismatches"
...