【问题标题】:Use multiple dataframes from a package of data in R在 R 中使用数据包中的多个数据帧
【发布时间】:2021-05-27 03:01:51
【问题描述】:

我正在使用 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 以使输出包含每个完整的数据帧,而不仅仅是每个数据帧的标题?

编辑:我还尝试在 lapply 中将“envir=.GlobalEnv”参数引入 load()。当我这样做时,数据框会加载,但仍然不在列表中。该列表仍然只包含作为字符串的名称。

【问题讨论】:

  • 你试过get/mget吗? df.list &lt;- mget(l.my.package$results[, 'Item'], inherits = TRUE)
  • @rawr mget 是一个非常简单的解决方案!谢谢!我不知道我一开始是怎么错过的 :)

标签: r list for-loop lapply


【解决方案1】:

如果您愿意使用打包的解决方案,我写了一个包调用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:\Users\User\AppData\Local\Temp\RtmpCSJ6Gc
# - 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"



【讨论】:

    【解决方案2】:

    @rawr 的回复完美:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2018-12-28
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多