R错误“由于类型不兼容,无法加入...”

GGA*_*son 5 r dplyr

我编写的代码在高吞吐量的生产环境中运行,期望可以处理来自多个用户的各种输入。在这种环境中,我经常需要使用dplyr连接两个具有不匹配类型的连接列的多列数据帧,从而产生此错误。“由于类型不兼容,无法加入...”

预期生产代码将处理输入csvs,这些csvs是150+列乘0-1000行,具有12-20个连接列。我使用read.table来提高速度,并且由于150列的内容可以变化,因此可以根据数据内容推断类型。

如果有一个通用功能可以以编程方式匹配联接列类型,而无需假设列名称或位置,那将是很好的。

GGA*_*son 12

这是一个经常查看的问题,因此许多其他人必须遇到错误,因此值得更完整的答案。

纠正此连接错误的简单解决方案是简单地改变导致问题的列的类。这可以按如下方式完成:

  1. 一瞥要加入的数据帧中的列类
  2. 使用 as.numeric、as.logical 或 as.character 改变列类以匹配。例如:

    df2 <- df2 %>%  
        mutate(column1 = as.numeric(column1))
    
    Run Code Online (Sandbox Code Playgroud)

生产环境的解决方案是在所示的 matchColClasses 函数中,它执行以下操作:

  1. 标识共享相同名称的列 (sharedColNames)
  2. 使用主数据框 (df1) 识别共享列类
  3. 重新分配 df2 中的列类以匹配 df1

    matchColClasses <- function(df1, df2) {
    
      sharedColNames <- names(df1)[names(df1) %in% names(df2)]
      sharedColTypes <- sapply(df1[,sharedColNames], class)
    
      for (n in sharedColNames) {
         class(df2[, n]) <- sharedColTypes[n]
      }
    
      return(df2)
     }
    
    Run Code Online (Sandbox Code Playgroud)

该功能在我们的生产环境中运行良好,具有异构数据类型;字符、数字和逻辑。

  • 现在 dplyr 中默认提供此功能:https://github.com/tidyverse/dplyr/issues/2355 (2认同)