r - 动态创建新变量,然后在 R 的循环中调用该变量
问题描述
我有一个循环读取一组文件,使用文件名动态分配每个对象的名称。每个文件被命名为“timeseries_”,然后是一年。
library(haven)
library(dplyr)
library(stringr)
files <- list.files(path="data-raw/timeseries", pattern="*.dta", full.names=TRUE, recursive=FALSE)
for(file in files){
assign(paste0("timeseries_",str_extract(file, "([0-9]+)")), read_dta(file))
}
读入每个文件后,我希望循环将对象保存到 .rda 文件中,但在引用刚刚创建的变量时遇到了麻烦。当我使用as.name()
我得到一个错误:
files <- list.files(path="data-raw/timeseries", pattern="*.dta", full.names=TRUE, recursive=FALSE)
for(file in files){
assign(paste0("timeseries_",str_extract(file, "([0-9]+)")), read_dta(file))
save(as.name(paste0("timeseries_",str_extract(file, "([0-9]+)"))),
file=paste0("data/pilot_",str_extract(file, "([0-9]+)"), ".rda"), compress="xz")
}
Error in save(as.name(paste0("timeseries_", str_extract(file, "([0-9]+)"))), :
object ‘as.name(paste0("timeseries_", str_extract(file, "([0-9]+)")))’ not found
是否有不同的方式来引用刚刚创建的变量?
解决方案
根据?save
帮助页面,save函数也可以通过参数将变量名作为字符串list=
。尝试这样的事情
files <- list.files(path="data-raw/timeseries", pattern="*.dta", full.names=TRUE, recursive=FALSE)
for(file in files) {
datayear <- str_extract(file, "([0-9]+)")
varname <- paste0("timeseries_", datayear)
filename <- paste0("data/pilot_", datayear, ".rda")
assign(varname, read_dta(file))
save(list=varname, file=filename, compress="xz")
}
此外,如果您只是将一个变量保存到文件中,请考虑saveRDS
改用。如果您以后不需要这些变量,它将允许您避免尴尬的分配。
files <- list.files(path="data-raw/timeseries", pattern="*.dta", full.names=TRUE, recursive=FALSE)
for(file in files) {
datayear <- str_extract(file, "([0-9]+)")
varname <- paste0("timeseries_", datayear)
filename <- paste0("data/pilot_", datayear, ".rds")
dtadata <- read_dta(file)
saveRDS(dtadata, file=filename, compress="xz")
}
你会用readRDS