在d:\文件夹中,我有很多Stata文件,例如data_aa_1.dta,data_aa_2.dta,data_aa_3.dta data_bb_1.dta,data_bb_2.dta,data_bb_3.dta,data_cc_1.dta ....我想转换这些文件获得与R中的dta文件一样多的数据帧.所以,我相信我必须循环c("aa","bb","cc")和c(1:3).我尝试过以下内容:
library(foreign)
for(i in c("aa","bb","cc"){
for (j in 1:3){
data_[i]_[j] <-read.dta("d:/folder/data_[i]_[j].dta")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这看起来不对 - 当然.
任何帮助将不胜感激.
谢谢!
bap*_*ste 10
试试这个,
fl = list.files(pattern = "dta", path = "d:/folder",
full.names = TRUE)
dl = lapply(fl, foreign::read.dta)
names(dl) = tools::file_path_sans_ext(fl)
str(dl)
Run Code Online (Sandbox Code Playgroud)
然而,毫无疑问,这是一个更优雅的解决方案
library(foreign)
for(i in c("aa","bb","cc"){
for (j in 1:3){
obj_name <- paste('data', i, j, sep ='_')
file_name <- file.path('d:/folder',paste(obj_name,'dta', sep ='.'))
input <- read.dta(file_name)
assign(obj_name, value = input)
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
避免for循环,并使用@joran的建议list.files
dta_files <- list.files('d:/folder', pattern = '.dta', full.names = T)
lapply(dta_files, function(fname){
input <- read.dta(fname)
obj_name <- tools::file_path_sans_ext(basename(fname))
assign(obj_name, value input, env = .GlobalEnv)})
Run Code Online (Sandbox Code Playgroud)