【问题标题】:Error: Can't combine <character> and <double> using bind_rows错误:无法使用 bind_rows 组合 <character> 和 <double>
【发布时间】:2021-08-17 14:17:43
【问题描述】:

我正在尝试读取多个 csv。文件并将它们合并为一个。

所以我原来有:

d <- list.files(path="data/", full.names = TRUE, pattern = "\\.csv$") %>%
  lapply(read_csv) %>%
 bind_rows

我收到以下错误:

错误:无法组合 rt 字符和 rt 双精度。

我想这一定是因为 rt 是一个变量,有时是数字,否则为空。

我尝试使用 mutate 将 rt 更改为 double,如下所示:

d <- list.files(path="data/", full.names = TRUE, pattern = "\\.csv$") %>%
  lapply(read_csv) %>%as.data.table()%>%mutate(across(rt, as.double))%>%
 bind_rows

但是,当我这样做时,我遇到了一个更复杂的问题。我收到以下消息:

第 1 项有 541 行,但最长的项有 583 行;与剩余物一起回收。第 3 项有 561 行,但最长的项目有 583 行;与剩余物一起回收。第 4 项有 473 行,但最长的项目有 583 行;与剩余物一起回收。第 5 项有 575 行,但最长的项目有 583 行;与剩余部分一起回收。第 6 项有 4 行,但最长的项目有 583 行;与剩余物一起回收。mutate() 输入 ..1 的问题。 i 由强制引入的 NA i 输入..1 是across(rt, as.double).NAs 由强制引入

似乎(根据我的理解)一个 csv 文件比另一个长,因此只有一个文件发生了突变,并且只有一个文件被绑定了。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您已正确诊断问题。您的修复失败,因为您忘记了您正在处理data.frames 的列表。您正在通过as.data.table 将它们转换为一个data.table,但这不会达到您想要的效果。相反,您需要使用 lapply (或类似方法)对列表中的所有表执行修复(即列转换):

    d <- list.files(path = "data", full.names = TRUE, pattern = "\\.csv$") %>%
      lapply(read_csv) %>%
      lapply(\(x) mutate(x, across(rt, as.double))) %>%
      bind_rows()
    

    【讨论】:

    • 这很有意义,但是as.data.table 函数会发生什么?变异动词不需要它在不是列表的东西中吗?
    • @josefc95 我真的不明白你为什么在这里使用as.data.table。代码中根本不需要使用“data.table”。您是否混淆了data.frame 和data.table?除非您的其他代码使用它,否则不要加载该包。至于你的另一个问题,是的,mutate 当然需要一张桌子——它得到一张桌子!您的第一个lapply 的结果是一个表列表(即,每个read_csv 调用一个表)。第二个lapply 依次在每个表上调用mutate。
    • 这很有意义!我以为他们是一样的!非常感谢您的帮助!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多