【问题标题】:Can't Combine X <character> and X <double>不能组合 X <character> 和 X <double>
【发布时间】:2021-06-30 01:30:42
【问题描述】:

我正在尝试使用以下方法将各种 .csv 文件合并到一个数据框中: df&lt;- list.files(path = "C:/Users...", pattern = "*.csv", full.names = TRUE) %&gt;% lapply(read_csv) %&gt;% bind_rows clean

但是,我收到一条错误消息,提示我无法组合 X 字符变量和 X 双变量。 有没有办法可以将其中一个转换为字符或双变量?

由于每个 csv 文件略有不同,从我初学者的角度来看,相信 lapply 在这种情况下是最好的,除非有更简单的方法来解决这个问题。

感谢大家的时间和关注!

【问题讨论】:

  • 你使用的是read_csv,你可以使用col_types=来设置类。见readr.tidyverse.org/articles/readr.html
  • 如果每个 CSV 文件都不同,那么我看不出盲人 bind_rows 是一种安全还是理智的方法。从几个文件中查看几行以了解“略有不同”的含义会有所帮助。
  • 抱歉没有澄清,但略有不同,我的意思是一些 CSV 文件的列比其他文件多 2-3 列,并且它们共享的列是相同的。

标签: r bind lapply


【解决方案1】:

您可以在所有文件中将X 变量更改为字符。您也可以使用map_df 将所有文件合并到一个数据框中。

library(tidyverse)

result <- list.files(path = "C:/Users...", pattern = "*.csv", full.names = TRUE) %>% 
  map_df(~read_csv(.x) %>% mutate(X = as.character(X)))

如果有更多列存在类型不匹配问题,您可以将所有列更改为字符,合并数据并使用type_convert 更改它们的类。

result <- list.files(path = "C:/Users...", pattern = "*.csv", full.names = TRUE) %>% 
  map_df(~read_csv(.x) %>% mutate(across(.fns = as.character))) %>%
  type_convert()

【讨论】:

  • 感谢您的回复。我试过了,但它一直告诉我同样的问题。可能是因为某些 CSV 的列比其他的多,它不能让它工作吗?
  • 您的第一个建议有效,但随后它告诉我其他变量不一致,当我尝试按照您的第二个建议提到的所有列执行此操作时,即它不起作用。
  • 这意味着除了X 之外,您的数据中还有其他列,这就是为什么当我们将所有列更改为字符时它起作用的原因。
【解决方案2】:

如果所有文件的列数相同,请尝试使用 plyrr::rbind.fill 代替 dplyr::bind_rows。

 list.files(path = "C:/Users...", pattern = "*.csv", full.names = TRUE) %>% lapply(read_csv)  %>% plyrr::rbind.fill

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2013-07-10
    相关资源
    最近更新 更多