R:将符合特定条件的.GlobalEnv变量放入列表中

R: Put Variables from .GlobalEnv, that meet certain criteria in list

有几个星期,我每周测量一次数据。由于测量仪器在其他地方使用过,我现在得到了很多 .csv-我读入 R 的文件,现在我的工作区中得到了它们。我将它们命名为相似的,因此所有 data.frames 都包含模式“11”。在他们的变量名中。我知道我可以通过使用

获得(仅)那些变量名的列表
ls(pattern = "11.")

但我想要一个包含 data.frameslist。当然,我可以返回我的脚本并更改 read.table 命令,例如

A.11.01 <- read.table(...)

data.list[1] <- read.table(...)

之后将列表元素 data.list[1] 的名称更改为“A.11.01”(如果我立即这样做,会节省很多时间)而且我很确定我可以还了解如何仅在一个命令中定义和命名列表元素,但感觉好像有一个非常简单的选项让 R 创建这个列表。

(我尝试的另一种方法是 data.list[1] <- .GlobalEnv[1],但我最终发现无法对 environment 进行子集化。(我的其他方法似乎太愚蠢了,根本无法提及。))

你可以使用

mylist <- mget(ls(pattern = "11.")) 

或者,如果你想确保你只得到 data.frames 与那个模式(而不是其他对象)你可以使用

mylist <- Filter(is.data.frame, mget(ls(pattern = "11.")))

顺便说一下,在你的情况下,使用

之类的方法直接将它们读入列表会很容易
listfiles <- list.files("path/to/folder", pattern = "\.csv$", full.names=TRUE)
mylist <- lapply(listfiles, read.csv, stringsAsFactors = FALSE)

stringsAsFactors = FALSE 只是一个示例,向您展示您可以轻松添加其他参数)

您可以通过多种方式做到这一点,计算机时间比人类时间便宜,因此根据 docendo discimus 的建议,对文件名向量使用 lapply 可能更明智。

但话又说回来,很容易将您的 .GlobalEnv 转换为列表,然后对其进行子集化,例如,使用 grep:

gelist <- as.list(.GlobalEnv)
# or ... as.list(environment())
gelist <- gelist[grep("^11\.", names(gelist))]
# ^ saying that expected pattern is at the beginning of the string
# and . has a special meaning for grep, so it has to be "escaped" by \
# see ?regexp