合并多个数据框 - match.names(clabs,names(xi))中的错误:名称与先前的名称不匹配

Jas*_*ine 6 merge r dataframe

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

我需要通过列'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)
Run Code Online (Sandbox Code Playgroud)

我查看了题为"将几个data.frames合并到一个带循环的data.frame"的问题的答案.我使用了那里建议的reduce方法以及我写的循环:

try1 = mymerge(dataList)

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

其中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
}
Run Code Online (Sandbox Code Playgroud)

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

真正奇怪的是使用它的工作原理:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:47, ])
Run Code Online (Sandbox Code Playgroud)

并使用此失败:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:48, ])
Run Code Online (Sandbox Code Playgroud)

据我所知,faq第48行没有什么特别之处.同样,使用此工作:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:47, ])
Run Code Online (Sandbox Code Playgroud)

并使用此失败:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:48, ])
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

第2列和第3列是"RID"和"VISCODE".

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

 dataList = list(demog[1:500,],
            neurobat[1:500,],
            apoe[1:500,],
            mmse[1:457,])
Run Code Online (Sandbox Code Playgroud)

使用mmse [1:458,]失败了.

我似乎无法提出导致问题的测试数据.以前有人有这个问题吗?有关如何合并的更好的想法?

nzc*_*ops 1

不幸的是,我不确定我能提供帮助,但我想我会发帖,因为我发现此错误正在寻求帮助。我有效拥有的是:

a <- cbind(b,c)
d <- merge(a,e)
Run Code Online (Sandbox Code Playgroud)

我也遇到了同样的错误。使用a <- data.frame(b,c)解决了问题,但我不明白为什么。

object.size(a);1248124200 bytes

object.size(c);1248124032 bytes
Run Code Online (Sandbox Code Playgroud)

所以有些东西是不同的。所有的类都是一样的,str()没有透露任何内容。我很困惑。

希望这对了解情况的其他人有所帮助。