我编写的代码在高吞吐量生产环境中运行,可以处理来自多个用户的各种输入。在这种环境中,我经常需要连接(使用dplyr)两个多列数据帧,这些数据帧具有不匹配类型的连接列,从而产生此错误。 "无法加入...因为类型不兼容"
生产代码应该处理150列以上0-1000行的输入csv,具有12-20个连接列。我使用read.table来提高速度,并且因为150列的内容可以变化,所以允许类型由数据内容推断。
如果有一个通用的函数以编程方式匹配连接列类型,那么就不会对列名或位置做出任何假设。
答案 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)
这是一个经常被查看的问题,因此很多其他人必须遇到错误,所以应该得到更完整的答案。
纠正此连接错误的简单解决方案是简单地改变导致问题的列的类。这可以按如下方式完成:
使用as.numeric,as.logical或as.character来修改列类以进行匹配。例如:
df2 <- df2 %>%
mutate(column1 = as.numeric(column1))
生产环境的解决方案在显示的matchColClasses函数中,它执行以下操作:
在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)
}
此功能在我们的生产环境中运行良好,具有异构数据类型;字符,数字和逻辑。