合并data.frames会导致match.names错误

时间:2012-01-17 17:19:50

标签: r merge dataframe

我需要合并许多data.frames。下面的代码示例重现错误。它看起来像一个bug。

此代码效果很好:

df1 <- data.frame(v=1:10, v2=rev(1:10))
df2 <- data.frame(vv=1:8, v2=rev(5:12))
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))
df3 <- data.frame(w=2:6, v2=3:7)
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))
df4 <- data.frame(x=1:6, v2=1:6)
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))

此代码在最后一行产生错误消息:match.names(clabs,names(xi))中的错误:名称与先前的名称不匹配。唯一的变化是nrow(df4)&gt; nrow(df123)

df1 <- data.frame(v=1:10, v2=rev(1:10))
df2 <- data.frame(vv=1:8, v2=rev(5:12))
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))
df3 <- data.frame(w=2:6, v2=3:7)
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))
df4 <- data.frame(x=1:16, v2=1:16)
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))

让我们看一下df123

列的名称
names(df123)
[1] "v"    "v2.x" "v2.y" "v2" 

然后更改任意一个

上的姓氏
names(df123)[4] <- "v3"

现在这行代码可以正常工作

df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y"))

是虫子吗?我在Win7上使用了R 2.13.1。 如果您需要其他信息,我会将其添加到问题中。

1 个答案:

答案 0 :(得分:4)

这绝对是一个错误,我在Windows 7的R 2.14.1中进行了测试,但我怀疑操作系统是否重要。我在这里重新创建了一个“较小”的错误测试案例:

# Create data.
df1=data.frame(rbind(c(1,10,12,NA)))
df2=data.frame(rbind(c(11,11)))

# Works fine.
merge(df1,df2,by=1,all=T)

#   X1 X2.x X3 X4 X2.y
# 1  1   10 12 NA   NA
# 2 11   NA NA NA   11

# Change the names of the columns.
names(df1)= c('v','v2.x','v2.y','v2')
names(df2)= c('x','v2')

# Same data fails!
merge(df1,df2,by=1,all=T)

# Error in match.names(clabs, names(xi)) : 
#   names do not match previous names

错误发生在“merge.data.frame”方法中,在此行:

x <- rbind(x, ya)

问题是“x”和“ya”不共享相同的列名。这个问题发生在这一行,只比前一行前两行:

ya <- cbind(ya, x[rep.int(NA_integer_, nyy), nm.x, drop = FALSE])

“nm.x”是一组名称c(“v2.x”,“v2.y”,“v2.x”)。和x是一个data.frame,有两列,名称为'v2.x'。有趣的是,当您从此data.frame中选择列时,它似乎重命名其中一列!

names(x)
[1] "v"    "v2.x" "v2.y" "v2.x"
nm.x
[1] "v2.x" "v2.y" "v2.x"
x[,nm.x]
  v2.x v2.y v2.x.1
1   10   12     10

我试图通过使用列的位置而不是名称来解决这个问题,但结果名称仍然会改变(但现在值是你想要的)!

x[,c(2,3,4)]
  v v2.x v2.y v2.x.1
1 1   10   12   NA

我有posted this as a bug