Объедините несколько кадров данных - Ошибка в match.names (clabs, имена (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, имена (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 из часто задаваемых вопросов. Аналогично, использование этого работает:

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 в часто задаваемых вопросах и строке 48 в pdx имеет те же значения для RID и VISCODE, то же значение для EXAMDATE (что-то, чему я не соответствую на) и различные значения для идентификатора (другая вещь, которой я не соответствую на). Помимо соответствия 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], сбои.

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

6
задан Sam M 23 January 2018 в 03:33
поделиться