tidyr::unnest() 具有不同的列类型

Ste*_*ted 5 r unnest tidyr

自从更新到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>.
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2019-10-11 创建

Hum*_*hen 4

您可以在解除嵌套之前将所有相关列转换为字符一步。

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

Run Code Online (Sandbox Code Playgroud)

如果有多个列需要处理,您可以执行以下操作:

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

后一个示例的数据:

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"))

Run Code Online (Sandbox Code Playgroud)