преобразовать список Rdata в фрейм данных в R

У меня есть 1000 списков, сохраненных как Rdata, сохраненных в одном каталоге. Каждый список имеет одно и то же имя, состоит из 5 элементов и выглядит следующим образом:

list.hv_Amono_volume

[[1]]
[1] 1.059246

[[2]]
[1] 1.047688

[[3]]
[1] 10.70799

[[4]]
[1] 10.30472

[[5]]
[1] 2.53379

При первом сохранении файлов в моем каталоге я дал каждому файлу уникальное имя, например: 1_list.hv_Amono_volume_rand.Rdata,

2_list.hv_Amono_volume_rand.Rdata,

3_list.hv_Amono_volume_rand.Rdata ... 1000_list.hv_Amono_volume_rand.Rdata

Я загрузил все 1000 файлов Rdata следующим образом:

 temp =list.files(path="mydirectory",pattern="*_list.hv_Amono_volume_rand.Rdata")

но теперь я не знаю, как извлечь данные из этого списка, очевидно, «temp» дает мне это

[1] "1_list.hv_Amono_volume_rand.Rdata"     "10_list.hv_Amono_volume_rand.Rdata"     
[3] "100_list.hv_Amono_volume_rand.Rdata"  "1000_list.hv_Amono_volume_rand.Rdata"
[5] "101_list.hv_Amono_volume_rand.Rdata"  "102_list.hv_Amono_volume_rand.Rdata" 
[7] "103_list.hv_Amono_volume_rand.Rdata"  "104_list.hv_Amono_volume_rand.Rdata" 
[9] "105_list.hv_Amono_volume_rand.Rdata"  "106_list.hv_Amono_volume_rand.Rdata" 

[11] "107_list.hv_Amono_volume_rand.Rdata" "108_list.hv_Amono_volume_rand.Rdata" [13] "109_list.hv_Amono_volume_rand.Rdata" "11_list.hv_Amono_volume_rand.Rdata"
[15] "110_list.hv_Amono_volume_rand.Rand.Rand" hv_Amono_volume_rand.Rdata" ...

Итак, теперь мне нужно знать, как извлечь данные из списка и привязать их к фрейму данных с 1000 столбцами, который выглядит так:

1          2         ... 1000
1.059246   1.044808      1.046917
1.047688   1.046857      1.036242
10.70799   10.70204      10.0781
10.30472   9.319236      10.29681
2.53379    2.430255      2.482879

Я пробовал играть с этим named.list ‹- lapply(temp,load)

и это

sapply(Amono_list.hv,  function(x) load(x, .GlobalEnv), USE.NAMES=FALSE)

но я, честно говоря, очень потерян и никуда не денусь, поэтому ваша помощь будет очень признательна.


person j_b    schedule 05.03.2015    source источник


Ответы (2)


#This may work 
do.call(cbind,mget(paste0(1:1000,"_list.hv_Amono_volume_rand")))

#Edit: as per comments

Пример:

x1<-as.list(1:3)
x2<-as.list(4:6)
save(x1,file="mydata1.RData") 
save(x2,file="mydata2.RData") 
tem<-list.files(pattern="*.RData")
str(tem)
 chr [1:2] "mydata1.RData" "mydata2.RData"
kk<-lapply(tem,load)
List of 2
 $ : chr "x1"
 $ : chr "x2"

do.call(cbind,lapply(1:2,function(i)get(kk[[i]])))
     [,1] [,2]
[1,] 1    4   
[2,] 2    5   
[3,] 3    6  
person Metrics    schedule 05.03.2015
comment
Спасибо за предложение. К сожалению, он сообщает мне, что не может найти значение для «1_list.hv_Amono_volume_rand». - person j_b; 05.03.2015
comment
Вам нужно сначала проверить, когда вы вводите 1_list.hv_Amono_volume_rand или 1000_list.hv_Amono_volume_rand в консоли, дает ли это вам результат?. Если вы это видите, этот код сработает.` - person Metrics; 05.03.2015
comment
к сожалению, это не дает мне выход. Я не могу понять, как получить доступ к данным в этом списке. Я знаю, что он есть, потому что я загрузил отдельные файлы и могу просмотреть их в консоли с помощью 'list.hv_Amono_volume'. это то же самое, загружаю ли я «1_list.hv_Amono_volume_rand» или «1000_list.hv_Amono_volume_rand». - person j_b; 05.03.2015
comment
В этом случае вам нужно сначала загрузить все файлы в temp . - person Metrics; 05.03.2015
comment
Хорошо, я загрузил все файлы. Но как я могу сказать do.call, чтобы получить файлы из temp. Я очень подозреваю, что я полностью упускаю из виду что-то здесь, потому что я просто не понимаю! Мне очень жаль. Кстати. str(temp) дает мне chr [1:1000] 1_list.hv_Amono_volume_rand.Rdata . 10_list.hv_Amono_volume_rand.Rdata ... Вроде правильно? - person j_b; 05.03.2015
comment
temp ‹- list.files(path=directory,pattern=*_list.hv_Amono_volume_rand.Rdata) do.call(cbind,lapply(1:1000,function(i)get(temp[i]))) дает мне эту ошибку: Ошибка в get(temp[i]): объект '1_list.hv_Amono_volume_rand.Rdata' не найден - person j_b; 05.03.2015
comment
Вам нужно загрузить каждый временный файл, прежде чем применять do.call. Позвольте мне обновить решение. - person Metrics; 05.03.2015
comment
Пожалуйста, проверьте ответ. Предполагается, что при загрузке каждого файла первый имеет номер 1, второй — номер 2, а последний файл — 1000. - person Metrics; 05.03.2015
comment
Спасибо большое за вашу помощь. get() не работал у меня в do.call(), поэтому вместо этого я использовал этот цикл. res <- matrix(nrow=5, ncol =1000) for(i in 1:length(kk)){ res[,i] <- unlist(get(kk[[i]])) } - person j_b; 06.03.2015

Это не проверено. Идея состоит в том, что когда вы загружаете () файл, загружаются объекты R. В этом примере я предполагаю, что каждый файл содержит только один объект R. В функции getList() мы загружаем файл во временную среду, читаем его, находим имя и возвращаем объект (надеюсь, это список). Основное предположение здесь состоит в том, что в файле есть только один объект, и это список. Затем используйте sapply, как вы пытались...

temp <-list.files(path="mydirectory",pattern="*_list.hv_Amono_volume_rand.Rdata")
e <- new.env()
getList <- function(filename){
  rm(list = ls(all = TRUE), envir=e) 
  load(filename, envir=e)
  # get name of thing you loaded... assuming just one thing there...
  theName <- ls(envir=e)[1]
  return(get(theName))
}
df <- sapply(temp, function(x)cbind(getList(x)))
person cory    schedule 05.03.2015
comment
да, каждый объект представляет собой список длиной 5. Но у меня их 1000 в одном файле в моем каталоге. Вы имеете в виду под именем файла имя файла, в котором хранятся мои объекты R? и под «theName» вы подразумеваете имя объекта Rdata после того, как я его загрузил? Потому что это имя одинаково для 1000 объектов. - person j_b; 05.03.2015
comment
да, имя файла - это имя файлов... которые должны храниться в temp. theName — это имя объекта, хранящегося в файле. Если вы знаете, что это за объект, вы можете вырезать эту часть функции. - person cory; 05.03.2015