Объединение нескольких фреймов данных - Ошибка в match.names(clabs, names (xi)): имена не соответствуют предыдущим именам

Я получаю некоторые странные вещи, пытаясь объединить несколько кадров данных. Помогите!

Мне нужно объединить кучу фреймов данных по столбцам "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)

Я посмотрел ответы на вопрос под названием "Слияние нескольких data.frames в один data.frame с циклом." Я использовал метод сокращения, предложенный там как а как цикл я написал:

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, ])

Насколько я могу судить, нет ничего особенного в строке 48 faq. Аналогично, используя это работает:

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, ])

Строка 48 в faq и строка 48 в pdx имеют одинаковые значения для 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,] не выполняется.

Я не могу придумать тестовые данные, которые вызывают проблему. У кого-нибудь была эта проблема раньше? Любые лучшие идеи о том, как слиться?

Ответ 1

Не уверен, что могу помочь, но думал, что я отправлю, поскольку нашел этот поиск помощи по этой ошибке. Что я имел в виду:

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

И у меня такая же ошибка. С помощью a <- data.frame(b,c) исправлена ​​проблема, но я не могу понять, почему.

object.size(a);1248124200 bytes

object.size(c);1248124032 bytes

Итак, что-то другое. Все классы одинаковы, str() ничего не показывает. Я в тупике.

Надеюсь, это поможет кому-то еще в курсе.