2012-01-17 75 views
1

我需要合并很多data.frames。在重现错误的代码示例下面。它看起来像一个错误。合并data.frames导致match.names错误

此代码工作得很好:

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,姓名(十一)):名不以前的名称相匹配。唯一的变化是,nrow(DF4)> 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

是的,这看起来像一个真正的bug。这可能必须发送到R列表服务器。尽管如此,我们应该尝试在merge.data.frame中找到相关的行。 – nograpes 2012-01-17 18:12:38

+1

我得到了与R 2.14.1相同的行为。我也可以确认错误发生在'nrow(df4)'变得大于'nrow(df123)';与'df4 < - data.frame(x = 1:10,v2 = 1:10)'一起工作,用'df4 < - data.frame(x = 1:11,v2 = 1:11)报错。我想象这个问题与它的作用有关:名称(df1234)给出了[1]“v”“v2.x”“v2.y”“v2.x”“v2.y”'。有重复的列名不应该发生良好构建的数据帧。错误是从'ribnd(x,ya)'抛出的(从'backtrace()'可以看到)。 – 2012-01-17 19:32:14

+0

感谢您的澄清! – DrDom 2012-01-17 20:49:57

回答

4

这绝对是一个bug,我在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“版本2.x”,“v2.y”,“版本2.x “)。而x是一个data.frame,其中两列名称为“v2.x”。有趣的是,当您从这个数据框中选择列时,它似乎重命名其中一列!

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

+0

感谢您提供错误报告,因为我在R中是相对新手,无法快速进行此类调查。为了解决我最初的问题,我将在每次合并后将列名替换为它们的编号,并在最终data.frame中将它们替换为存储在单独向量中的正确名称(是的,我需要重复的名称)。 – DrDom 2012-01-17 20:44:40

+0

要在此处关闭循环:R NEWS文件中的2012-01-24条目包含“merge()”不再允许创建具有重复列名的数据帧(这会混淆PR#14786)。 PR#14786引用https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14786这是来自此讨论的错误报告。 – 2012-01-24 19:23:36