【发布时间】: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 <- data.frame(x=1:10, v2=1:10)它可以工作,使用df4 <- data.frame(x=1:11, v2=1:11)它会给出报告的错误。我想这个问题与names(df1234)给出[1] "v" "v2.x" "v2.y" "v2.x" "v2.y"有关。对于构造良好的数据框,不应出现重复的列名。错误是从ribnd(x, ya)抛出的(从backtrace()可以看出)。 -
感谢您的澄清!