【问题标题】:tidyr::unnest() with different column typestidyr::unnest() 具有不同的列类型
【发布时间】:2020-02-08 17:58:14
【问题描述】:

自从更新到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>.

reprex package (v0.3.0) 于 2019 年 10 月 11 日创建

【问题讨论】:

  • 您仍然可以使用旧的unnesttibble(file = list(a, b, c)) %&gt;% unnest_legacy(file)
  • 或者把这个放在mutate(file = map(file, ~ mutate(.x, char_vec = as.character(char_vec))))之间
  • unnest &lt;- unnest_legacy 之前 tibble ...
  • 感谢 cmets,他们都很有帮助。 @Humpelstielzchen - 你能提交答案吗?我认为你的解决方案是最好的长期解决方案。干杯。

标签: r tidyr unnest


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多