tidyr :: unnest () с разными типами столбцов - PullRequest
1 голос
/ 11 октября 2019

После обновления до tidyr версии 1.0.0 я начал получать сообщение об ошибке при удалении списка фреймов данных.

Ошибка возникает из-за того, что некоторые фреймы данных в списке содержат столбец свсе значения NA (логические), в то время как другие кадры данных содержат тот же столбец, но с некоторыми символьными значениями (символ). Столбцы со всеми значениями NA кодируются как логические, а остальные - как символьные векторы.

Поведение по умолчанию более ранних версий tidyr обрабатывало различные типы столбцов без проблем (по крайней мере, я не получилэта ошибка при запуске скрипта).

Могу ли я решить эту проблему изнутри tidyr::unest()?

Воспроизводимый пример:

library(tidyr)

a <- tibble(
  value = rnorm(3),
  char_vec = c(NA, "A", NA))

b <- tibble(
  value = rnorm(2),
  char_vec = c(NA, "B"))

c <- tibble(
  value = rnorm(3),
  char_vec = c(NA, NA, NA))

tibble(
  file = list(a, b, c)) %>% 
  unnest(cols = c(file))
#> No common type for `..1$file$char_vec` <character> and `..3$file$char_vec`
#> <logical>.

Создано в 2019-10-11 представителем пакета (v0.3.0)

1 Ответ

1 голос
/ 11 октября 2019

Вы можете преобразовать все соответствующие столбцы в символы за один шаг до отмены.

tibble(
  file = list(a, b, c)) %>% 
  mutate(file = map(file, ~ mutate(.x, char_vec = as.character(char_vec)))) %>%
  unnest(cols = c(file))

Если есть несколько столбцов, требующих обработки, вы можете сделать:

 tibble(
  file = list(a, b, c)) %>% 
  mutate(file = map(file, ~ mutate_at(.x, vars(starts_with("char")), ~as.character(.)))) 

Данные для последнегопример:

a <- tibble(
  value = rnorm(3),
  char_vec = c(NA, "A", NA),
  char_vec2 = c(NA, NA, NA))

b <- tibble(
  value = rnorm(2),
  char_vec = c(NA, "B"),
  char_vec2 = c("C", "A"))

c <- tibble(
  value = rnorm(3),
  char_vec = c(NA, NA, NA),
  char_vec2 = c("B", NA, "A"))

...