【问题标题】:Merge data.frames cause match.names error合并 data.frames 导致 match.names 错误
【发布时间】:2012-01-17 17:19:49
【问题描述】:

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

这段代码运行良好:

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

【问题讨论】:

  • 是的,这看起来像一个真正的错误。这可能必须发送到 R listserv。不过,我们应该先尝试在 merge.data.frame 中找到相关行。
  • 我得到了与 R 2.14.1 相同的行为。我还可以确认nrow(df4) 发生的错误大于nrow(df123);使用df4 &lt;- data.frame(x=1:10, v2=1:10) 它可以工作,使用df4 &lt;- data.frame(x=1:11, v2=1:11) 它会给出报告的错误。我想这个问题与names(df1234) 给出[1] "v" "v2.x" "v2.y" "v2.x" "v2.y" 有关。对于构造良好的数据框,不应出现重复的列名。错误是从ribnd(x, ya) 抛出的(从backtrace() 可以看出)。
  • 感谢您的澄清!

标签: r merge dataframe


【解决方案1】:

这绝对是一个错误,我在 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

【讨论】:

  • 感谢您的错误报告,因为我是 R 的新手,无法快速进行此类调查。为了解决我最初的问题,我将在每次合并后用它们的编号替换列名,并在最终的 data.frame 中用存储在单独向量中的正确名称替换它们(是的,我需要重复的名称)。
  • 在这里结束循环:R NEWS 文件中的 2012-01-24 条目包含“merge() 不再允许创建具有重复列名的数据框(这混淆了 PR#14786 )。” PR#14786 指的是bugs.r-project.org/bugzilla3/show_bug.cgi?id=14786,这是从这个讨论中得出的错误报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2015-01-06
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多