将数据框加载到列表中

9

我正在尝试将一堆*.Rdata文件加载到一个列表中。

files <- paste0("name", 1:10, ".Rdata")
data <- lapply(files, load)

这将创建一个列表,其中每个元素都只包含数据框的名称,没有其他内容。

如果我重新定义文件,使其只包含第一个文件,并调用:

load(files)

然后是"works",但是'files'中的文件被分配给了全局环境,这不是我想要的。
我想最终得到一个列表,其中每个元素都包含数据框。这样当我进行数据处理时,我可以对列表进行lapply操作。

你是否有多个对象(data.frames)对应每个.Rdata文件? - akrun
尝试使用 lapply(files, function(x) mget(load(x))) - akrun
为什么不将它们全部加载到环境中,然后使用 as.list() 强制转换呢? - Gregor Thomas
顺便提一下,如果您可以控制这些文件的创建方式,可以尝试使用RDS格式,通过saveRDS()readRDS()实现。这样,就不需要使用get(),因为每个文件只有一个对象。 - Michael Lawrence
@user3551644 get/mget 解决方案有问题吗? - akrun
显示剩余8条评论
2个回答

10

你可以尝试

lapply(files, function(x) mget(load(x)))
mget会返回列表中对象(或多个对象)的值。在您的.Rdata文件中,每个文件只有一个'data.frame'对象。因此,即使使用get也可以工作。
在您的代码中,
load(files[1]) 

这些对象将在全局环境中找到。假设对象是“d1”,通过在控制台键入“d1”,您可以获得该对象的值。同样的方式。

lapply(files, load, .GlobalEnv)

将对象加载到全局环境中,可以通过键入来访问。我猜你的问题是如何获取列表中的值,可以使用get或者mget来完成。


7
现在已经测试,确实有效!
e1 = new.env()
invisible(lapply(files, load, envir = e1))
my_list = as.list(e1)

@user3551644 哎呀,当然不起作用,因为 lapply 不会返回环境,所以它就无法嵌套。现在已经修复了。 - Gregor Thomas
这个解决方案非常方便,因为它将对象的名称保留在列表内部。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接