Объединить несколько больших фреймов данных со многими несоответствующими столбцами в R - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть список из 140 фреймов данных, каждый из которых имеет разное количество строк и столбцов. Единственное, что у них общего, - это то, что у них sample ID как имена строк и years как столбцы. Годы находятся между 1400-2018, и разные фреймы данных имеют выборки в разные периоды времени между этими датами Следовательно, некоторые столбцы совпадают (т.е. все кадры данных имеют значения в эти годы), а другие нет (например, только 1 или 2 кадра данных имеют значения в эти годы). Пример фрейма данных показан ниже:

> dput(shell[[20]])
  list(structure(list(`1847` = c(NA, NA, NA, NA, NA, NA, NA, 1.33, 
                                NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
                                ), `1848` = c(NA, NA, NA, NA, NA, NA, 1.86, 1.46, NA, NA, NA, 
                                NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), `1849` = c(NA, 
                                NA, NA, NA, NA, NA, 1.75, 1.5, NA, NA, NA, NA, NA, NA, NA, NA, 
                                NA, NA, NA, NA, NA, NA, NA, NA), `1850` = c(NA, NA, NA, NA, NA, 
                                NA, 1.7, 1.23, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 

                                                ... 

Я хочу объединить эти фреймы данных так, чтобы имена строк были сохранены (то есть просто вставлены их друг под другом), и значения в столбцах были сопоставлены - т.е. если данный образец имеет значения в диапазоне 1650-1700, они сохраняются, а для years, где этот образец не имеет значения, NA Мне также нужны годы, чтобы следовать от самого раннего до настоящего времени. Итак, я хочу, чтобы это выглядело так:

.. 1847  1848  1849 ... 
S1  NA   NA    NA
S2  12.5  3.5  4.5
S3  NA   NA    12.5

Я пытался сделать это с bind_rows и rbind.fill, и это работает для некоторых столбцов, но не для других - у меня есть некоторые очень странные столбцы (например, имена столбцов -150 в середине данных).

Что я мог сделать не так?

1 Ответ

1 голос
/ 27 апреля 2020

Если вы конвертируете data.frames в data.table объекты, вы можете попробовать следующее:

library(data.table)
lapply(shell, setDT)

Затем вы можете использовать функцию rbindlist, которая очень эффективна и мощна:

data <- rbindlist(shell, use.names = TRUE, fill = TRUE)

Наконец, чтобы изменить порядок столбцов, вы можете использовать setcolorder. Что-то в этом вкусе (возможно, вам придется немного его адаптировать):

years <- as.character(1400:2018)[as.character(1400:2018) %in%  colnames(data)]
setcolorder(data, c("sampleID", years))
...