【问题标题】:convert list of Rdata into dataframe in R将Rdata列表转换为R中的数据框
【发布时间】:2015-03-05 11:06:45
【问题描述】:

我有 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_Amno_volume_rand.Rdata,

2_list.hv_Amno_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.Rdata” “111_list.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

还有这个

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

但老实说,我非常迷茫,无处可去,因此非常感谢您的帮助。

【问题讨论】:

    标签: r list dataframe rdata


    【解决方案1】:
    #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  
    

    【讨论】:

    • 感谢您的建议。不幸的是,它告诉我它找不到“1_list.hv_Amono_volume_rand”的值。
    • 您需要先检查您在控制台中输入1_list.hv_Amono_volume_rand1000_list.hv_Amono_volume_rand 时,它会给您输出吗?如果你看到了,这段代码就可以工作了。`
    • 不幸的是它没有给我输出。我不知道如何访问该列表中的数据。我知道它在那里,因为我已经加载了单个文件,并且可以在控制台中使用“list.hv_Amono_volume”查看它们。无论我加载“1_list.hv_Amono_volume_rand”还是“1000_list.hv_Amono_volume_rand”,这都是一样的。
    • 这种情况下需要先加载temp中的所有文件。
    • 好的,我已经加载了所有文件。但是我如何告诉 do.call 从 temp 获取文件。我很怀疑我在这里完全忽略了一些东西,因为我就是不明白!真对不起。顺便提一句。 str(temp) 给了我 chr [1:1000] "1_list.hv_Amono_volume_rand.Rdata" 。 “10_list.hv_Amono_volume_rand.Rdata”……这样说对吗?
    【解决方案2】:

    这是未经测试的。这个想法是,当您 load() 一个文件时,会加载 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)))
    

    【讨论】:

    • 是的,每个对象都是一个长度为 5 的列表。但我的目录中的一个文件中有 1000 个。您的意思是文件名是我的 R 对象存储在其中的文件的名称吗? 'theName' 是指加载后的 Rdata 对象的名称吗?因为这 1000 个对象的名称相同。
    • 是的,filename 是文件的名称...应该存储在“temp”中。 theName 是存储在文件中的对象的名称。如果你知道那个对象是什么,你就可以剪掉那部分功能。
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多