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

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

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

Я посмотрел ответы на вопрос, озаглавленный «Объединить несколько фреймов данных в один фрейм данных с циклом.» Я использовал предложенный там метод сокращения, а также цикл, который я написал:

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 Ответ

1 голос
/ 21 февраля 2011

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

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

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

object.size(a);1248124200 bytes

object.size(c);1248124032 bytes

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...