Загрузка данных из файлов RData в единую таблицу данных

Я пытаюсь загрузить данные из объектов фрейм данных всех .RData файлов в указанном каталоге в одну таблицу данных. Вот как я пытался это сделать:

library(data.table)

fileList <- list.files("../cache/FLOSSmole", pattern="\\.RData$", full.names=TRUE)
dataset <- rbindlist(lapply(fileList, FUN=function(file) {as.data.table(load(file))}))

Однако результат отличается от ожидаемого (одна таблица данных, содержащая все данные) — она содержит только имена объектов фрейма данных из источника. .RData файлов:

> str(dataset)
Classes ‘data.table’ and 'data.frame':  39 obs. of  1 variable:
 $ V1: chr  "lpdOfficialBugTags" "lpdLicenses" "lpdMilestones" "lpdSeries" ...
 - attr(*, ".internal.selfref")=<externalptr>
> head(dataset)
                        V1
1:      lpdOfficialBugTags
2:             lpdLicenses
3:           lpdMilestones
4:               lpdSeries
5:             lpdProjects
6: lpdProgrammingLanguages

Что я делаю не так? Мы очень ценим вашу помощь!

Моя среда R:

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] data.table_1.9.2

loaded via a namespace (and not attached):
[1] plyr_1.8.1    Rcpp_0.11.1   reshape2_1.4  stringr_0.6.2 tools_3.1.0

person Aleksandr Blekh    schedule 08.07.2014    source источник
comment
@Arun: Спасибо за очистку списка тегов.   -  person Aleksandr Blekh    schedule 08.07.2014
comment
Гораздо проще, быстрее и проще использовать fread вместо .Rdata. rbindlist(lapply(files, fread))...   -  person Arun    schedule 08.07.2014
comment
@Arun: я видел этот код ранее, когда изучал тему, но, насколько я понимаю, fread() является альтернативой data.table для read.table(). Если я собираю данные из первоисточников и хочу эффективно хранить их в виде кеша приложения (.RData или .rds), мне все равно придется использовать save() и load() или saveRDS() и readRDS() соответственно, не так ли?   -  person Aleksandr Blekh    schedule 08.07.2014


Ответы (1)


.RData — это сохраненная рабочая область, она может содержать фреймы данных, но не является фреймом данных. Сколько фреймов данных содержится в каждом .RData? Вы можете загрузить несколько файлов .RData и добавить их в текущую рабочую область. Просто загрузите их все, а затем merge или rbind data.frames, как только они окажутся в вашей текущей рабочей области.

# lapply(FileList,function(x) load(x)) # Changed to a for loop, I guess the lapply was only loading into the lapply environment which disappears when the function ends
for (i in 1:length(FileList)) {
   load(FileList[i])
}
my.list <- vector(length(ls()),mode="list")
for (i in 1:length(ls())) {
    my.list[[i]] <- get(ls()[i])
}
my.rbind <- do.call(rbind,my.list)

Это один из способов. Более простым способом было бы сохранить отдельные таблицы в виде текстовых файлов с разделителями.

person JeremyS    schedule 08.07.2014
comment
Спасибо за ответ! В настоящее время каждый файл .RData содержит один фрейм данных. Я оставил такой дизайн для этого фрагмента кода (вместо использования .rds файлов для хранения отдельных объектов, как я делаю в других местах), так как планирую реализовать единое многообъектное .RData файловое решение. Я объединяю таблицы данных, но сначала преобразую фреймы данных в таблицы данных. Итак, что случилось? - person Aleksandr Blekh; 08.07.2014
comment
.RData, даже если он содержит только один data.frame, не может использоваться так, как если бы это был data.frame. - person JeremyS; 08.07.2014
comment
load(.RData) добавляет .RData в вашу текущую рабочую область. Вам нужно вызвать as.data.table для data.frame в этой рабочей области, а не для команды загрузки. - person JeremyS; 08.07.2014
comment
Я понимаю. Думаю, теперь я понимаю... Основная причина моей проблемы в том, что load() возвращает вектор символов имен созданных объектов. Но как мне передать ссылку на объект фрейма данных в as.data.table()? Я думаю об использовании get() для этого. - person Aleksandr Blekh; 08.07.2014
comment
Я запутался: когда я вызываю load() для отдельного файла .RData, соответствующий фрейм данных загружается в мою глобальную рабочую область, но когда я делаю то же самое для всех файлов через lapply(), фреймы данных не загружаются. - person Aleksandr Blekh; 08.07.2014
comment
Я изменил его на цикл for, который часто лучше подходит для изменения чего-либо в глобальной среде, и добавил, как составить список фреймов данных после их загрузки. Мораль истории: отдельные .RData файлы неразумны. - person JeremyS; 08.07.2014
comment
Большое спасибо! Итак, я был прав насчет get() - по крайней мере, я не совсем потерялся в океане R, но иногда мне так кажется... :-). Принимаю ваш ответ и еще раз спасибо! - person Aleksandr Blekh; 08.07.2014
comment
Что касается вашей заметки о сохранении отдельных таблиц, весь смысл моих усилий по объединению данных заключается в том, чтобы упростить доступ/запрос данных, которые мне нужны для дальнейшего статистического анализа. - person Aleksandr Blekh; 08.07.2014