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