使用r中一个数据包中的多个数据帧



我正在使用一个R包中的大型数据集。

我需要把所有单独的数据帧放到我的全局环境中,最好是放到一个数据帧列表中,这样我就可以在以后使用lapply执行一些重复的操作。

到目前为止,我已经完成了以下操作:
l.my.package <- data(package="my.package")
lc.my.package <- l.my.package[[3]]
lc.df.my.package <- as.data.frame(lc.my.package)

这有效地创建了包中每个. rdata文件的位置和名称的数据帧,因此我可以加载它们。

我已经知道如何使用for循环加载它们。我创建了一个路径名向量,并将其输入循环:

f <- path('my/path/folder', lc.df.my.package$Item, ext="rdata")
f.v <- as.vector(f)
for (i in f.v) {load(i)}

这将所有内容加载到单独的数据帧中(如我所愿),但它显然没有将数据帧放入列表中。我认为lapply可以在这里工作,但是当我使用lapply时,结果列表是一个字符串列表(每个数据帧的标题,不包括数据)。代码看起来像这样:

f.l <- as.list(f)
func <- function(i) {load(i)}
df.list <- lapply(f.l, func)

我正在寻找两种可能的解决方案之一:

  1. 如何有效地将for循环的输出收集到列表中("while")循环可能太慢了)?
  2. 我如何调整lapply,使输出包括每个整个数据帧,而不仅仅是每个数据帧的标题?

编辑:我也试过引入"envir=. globalenviv "参数在lapply中装入load()。当我这样做时,数据帧被加载,但仍然不在列表中。该列表仍然只包含名称作为字符串。

如果您愿意使用打包的解决方案,我编写了一个名为libr的包,它可以完全满足您的要求。下面是一个例子:


library(libr)
# Create temp directory
tmp <- tempdir()
# Save some data to temp directory
# for illustration purposes
saveRDS(trees, file.path(tmp, "trees.rds"))
saveRDS(rock, file.path(tmp, "rocks.rds"))
# Create library
libname(dat, tmp)
# library 'dat': 2 items
# - attributes: not loaded
# - path: C:UsersUserAppDataLocalTempRtmpCSJ6Gc
# - items:
#    Name Extension Rows Cols   Size        LastModified
# 1 rocks       rds   48    4 3.1 Kb 2020-11-05 23:25:34
# 2 trees       rds   31    3 2.4 Kb 2020-11-05 23:25:34
# Load library
lib_load(dat)
# Examine workspace
ls()
# [1] "dat" "dat.rocks" "dat.trees" "tmp"
# Unload the library from memory
lib_unload(dat)
# Examine workspace again
ls()
# [1] "dat" "tmp"

@rawr的响应非常完美:

df.list <- mget(l.my.package$results[, 'Item'], inherits = TRUE)

最新更新