tidyr::unnest()与不同的列类型

oalqel3c  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(85)

自从更新到tidyr版本1.0.0后,我开始在取消嵌套一个嵌套列表时出错。
该错误是因为列表中的某些 Dataframe 包含一个列,其中所有NA值(逻辑),而其他 Dataframe 包含相同的列,但具有一些字符值(字符)。具有所有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由reprex package(v0.3.0)

mcvgt66p

mcvgt66p1#

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

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

ryevplcw2#

有一个类似的问题,遇到了这个线程。我相信,在purrr > 1.0.0的情况下,公认的答案不再起作用。
如果你有问题,你可以使用rbind

rbind(a, b, c)

相关问题