Я получаю некоторый действительно причудливый материал при попытке объединить несколько кадров данных.На помощь!
Я должен объединить набор кадров данных столбцами '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], сбои.
Я, может казаться, не придумываю данные тестирования, которые вызывают проблему. У кого-либо была эта проблема прежде? Какие-либо лучшие идеи о том, как объединиться?