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
?