如何在for循环中重命名数据框

use*_*921 15 for-loop r

我对使用R编程非常陌生,但我正在尝试在多个文件中读取目录并为每个文件指定一个唯一的名称.我正在使用R中的Dendrochronology Program Library(包dpIR)和read.tucson函数读取文件.虽然我正在使用特定的包,但我认为我的问题相当笼统:

在循环中,我想通过将a "t"与每个单独的文件名连接来创建文件.所以,如果我有一个"2503"在我的目录中命名的文件,我想在R中创建一个名为的数据帧"t2503".接下来,我想在r.tucson每个数据帧中使用该函数读取数据.我只是用数据覆盖串联,而不是将读入数据分配给数据帧.有人可以帮我弄清楚我错过了哪一步?

这是我尝试使用的代码:

#set to appropriate directory
setwd("C:/work")

#get a list of files in the directory
files <- list.files()
numfiles <- length(files)

for (i in 1:numfiles)
{
    name<-paste("t",files[i],sep="")
    name<-read.tucson(files[i],header=NULL)
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*h_J 29

我想你自己给出了答案:你必须使用?assign.

尝试类似的东西:

for (i in 1:5) {
  assign(paste0("DF", i), data.frame(A=rnorm(10), B=rnorm(10)))
}
Run Code Online (Sandbox Code Playgroud)

这将循环从1到5的整数,并创建五个data.frames"DF1"到"DF5".对于您的示例,您应该只需要替换

name<-read.tucson(files[i],header=NULL)
Run Code Online (Sandbox Code Playgroud)

assign(name, read.tucson(files[i],header=NULL))
Run Code Online (Sandbox Code Playgroud)

但是请注意,这name是R中的基本函数,所以我会使用另一个命名约定或者只是跳过第一行:

assign(paste("t",files[i],sep=""), read.tucson(files[i],header=NULL))
Run Code Online (Sandbox Code Playgroud)

我希望这就是你要找的东西.

  • 警告:当你在函数中使用`assign`时,它的行为与在顶层使用它不同,你迟早需要`env = .GlobalEnv`. (7认同)
  • 最佳做法是使用`lapply`将所有文件读入一个列表,而不是将环境与多个对象混淆(并且进行全局分配甚至更糟.) (2认同)