首页 > 解决方案 > 动态创建新变量,然后在 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

是否有不同的方式来引用刚刚创建的变量?

标签: r

解决方案


根据?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


推荐阅读