我需要合并许多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。 如果您需要其他信息,我会将其添加到问题中。
答案 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