R错误"无法加入......因为类型不兼容"

时间:2018-03-10 23:47:56

标签: r dplyr

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

生产代码应该处理150列以上0-1000行的输入csv,具有12-20个连接列。我使用read.table来提高速度,并且因为150列的内容可以变化,所以允许类型由数据内容推断。

如果有一个通用的函数以编程方式匹配连接列类型,那么就不会对列名或位置做出任何假设。

2 个答案:

答案 0 :(得分:1)

如果问题是在读取数据后未正确检测到列类 - 您可以在数据读取步骤中为每列指定类。

因此,使用function is_curl() { if (stristr($_SERVER["HTTP_USER_AGENT"], 'curl')) return true; } 函数,您可以这样做:

read.csv()

在此df1 <- read.csv("data.csv", colClasses=c("numeric", "Date", "character")) df2 <- read.csv("data.csv", colClasses=c("numeric", "Date", "character")) 之后,df1将包含相同类型的列。

这里的类只是一个示例,您必须指定适用于您的数据的类。

另请查看df2

答案 1 :(得分:1)

这是一个经常被查看的问题,因此很多其他人必须遇到错误,所以应该得到更完整的答案。

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

  1. 瞥见要加入的数据框中的列类
  2. 使用as.numeric,as.logical或as.character来修改列类以进行匹配。例如:

    df2 <- df2 %>%  
        mutate(column1 = as.numeric(column1))
    
  3. 生产环境的解决方案在显示的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)
       }
      
    4. 此功能在我们的生产环境中运行良好,具有异构数据类型;字符,数字和逻辑。