【问题标题】:Merge multiple data frames - Error in match.names(clabs, names(xi)) : names do not match previous names合并多个数据框 - match.names(clabs, names(xi)) 中的错误:名称与以前的名称不匹配
【发布时间】:2011-01-31 01:32:57
【问题描述】:

在尝试合并多个数据帧时,我得到了一些非常奇怪的东西。救命!

我需要按“RID”和“VISCODE”列合并一堆数据框。以下是它的外观示例:

d1 = data.frame(ID = sample(9, 1:100), RID = c(2, 5, 7, 9, 12),
            VISCODE = rep('bl', 5),
            value1 = rep(16, 5))

d2 = data.frame(ID = sample(9, 1:100), RID = c(2, 2, 2, 5, 5, 5, 7, 7, 7),
            VISCODE = rep(c('bl', 'm06', 'm12'), 3),
            value2 = rep(100, 9))

d3 = data.frame(ID = sample(9, 1:100), RID = c(2, 2, 2, 5, 5, 5, 9,9,9),
            VISCODE = rep(c('bl', 'm06', 'm12'), 3),
            value3 = rep("a", 9),
            values3.5 = rep("c", 9))

d4 = data.frame(ID =sample(8, 1:100), RID = c(2, 2, 5, 5, 5, 7, 7, 7, 9),
            VISCODE = c(c('bl', 'm12'), rep(c('bl', 'm06', 'm12'), 2), 'bl'),
            value4 = rep("b", 9))

dataList = list(d1, d2, d3, d4)

我查看了标题为 "Merge several data.frames into one data.frame with a loop." 的问题的答案,我使用了那里建议的 reduce 方法以及我写的循环:

try1 = mymerge(dataList)

try2 <- Reduce(function(x, y) merge(x, y, all= TRUE,
by=c("RID", "VISCODE")), dataList, accumulate=F)

dataList 是数据框列表,mymerge 是:

mymerge = function(dataList){

L = length(dataList)

mdat = dataList[[1]]

  for(i in 2:L){

    mdat = merge(mdat, dataList[[i]], by.x = c("RID", "VISCODE"),
                                  by.y = c("RID", "VISCODE"), all = TRUE)
  }

mdat
}

对于我的测试数据和我的真实数据的子集,它们都可以正常工作并产生完全相同的结果。但是,当我使用较大的数据子集时,它们都会崩溃并给我以下错误: match.names(clabs, names(xi)) 中的错误:名称与以前的名称不匹配。

真正奇怪的是,使用它可以:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:47, ])

使用这个失败了:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:48, ])

据我所知,faq 的第 48 行没有什么特别之处。同样,使用它也可以:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:47, ])

使用这个失败了:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:48, ])

faq 中的第 48 行和 pdx 中的第 48 行具有相同的 RID 和 VISCODE 值,相同的 EXAMDATE 值(我不匹配的东西)和不同的 ID 值(另一个我不匹配的东西) .除了匹配的 RID 和 VISCODE 之外,我还看到了它们的特别之处。它们不共享任何其他变量名称。同样的情况发生在数据的其他地方,没有问题。

要为复杂功能锦上添花,这甚至行不通:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:48, 2:3])

其中第 2 列和第 3 列是“RID”和“VISCODE”。

48 甚至不是神奇的数字,因为它有效:

 dataList = list(demog[1:500,],
            neurobat[1:500,],
            apoe[1:500,],
            mmse[1:457,])

使用 mmse[1:458, ] 时失败。

我似乎想不出导致问题的测试数据。以前有人遇到过这个问题吗?关于如何合并有更好的想法吗?

【问题讨论】:

  • 你能真正显示问题数据帧的第 47 行和第 48 行吗?我猜这与不同的数据类型有关......
  • faq[48,] ID RID VISCODE EXAMDATE FAQSOURCE FAQFINAN FAQFORM 48 1230 16 m12 04/12/2006 2 0 0 FAQSHOP FAQGAME FAQBEVG FAQMEAL FAQEVENT FAQTV FAQREM 48 0 0 0 0 0 0 0 FAQTRAVL FAQTOTAL 48 0 0
  • 哦,哇,这看起来很糟糕。让我再试一次
  • faq[48,] ID RID VISCODE EXAMDATE FAQSOURCE FAQFINAN FAQFORM 48 1230 16 m12 04/12/2006 2 0 0 FAQSHOP FAQGAME FAQBEVG FAQMEAL FAQEVENT FAQTV FAQREM 48 0 0 0 0 0 0 0 FAQTRAVL FAQTOTAL 48 0 0
  • 仍然很糟糕。不知道如何最好地做到这一点。 faq[48,] 中的值主要是 0。 pdx[48,] 中的值主要是 -4。它们都有日期格式的日期和 VISCODE 的字符串。

标签: r dataframe merge


【解决方案1】:

不幸的是,我不确定我是否可以提供帮助,但我想我会发帖,因为我发现这个正在寻找有关此错误的帮助。我实际上拥有的是:

a <- cbind(b,c)
d <- merge(a,e)

我也遇到了同样的错误。使用a &lt;- data.frame(b,c) 解决了这个问题,但我不知道为什么。

object.size(a);1248124200 bytes

object.size(c);1248124032 bytes

所以有些不同。所有的类都是一样的,str() 什么也没透露。我被难住了。

希望对其他知情人士有所帮助。

【讨论】:

  • 试试all.equal函数。它会打印一些有关差异的详细信息。
猜你喜欢
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2023-03-24
  • 2012-08-14
  • 2021-02-12
  • 2019-01-10
相关资源
最近更新 更多