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

22

我对使用R进行编程非常陌生,但我正在尝试读取目录中的多个文件并为它们命名。我正在使用R中的树轮学程序库(dpIR包)和read.tucson函数来读取文件。虽然我正在使用特定的软件包,但我认为我的问题是相当普遍的:

在循环内部,我想通过将"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)
}
1个回答

35
我认为你已经给出了答案:你需要使用?assign
尝试像这样做:
for (i in 1:5) {
  assign(paste0("DF", i), data.frame(A=rnorm(10), B=rnorm(10)))
}

这段代码循环遍历整数1到5,并创建了五个数据框"DF1"到"DF5"。对于您的示例,您只需要替换

即可。
name<-read.tucson(files[i],header=NULL)

使用

assign(name, read.tucson(files[i],header=NULL))

请注意,name在R中是一个基本函数,因此我建议使用其他命名规范或者跳过第一行。
assign(paste("t",files[i],sep=""), read.tucson(files[i],header=NULL))

我希望这正是你所需要的内容。

谢谢你的帮助!我尝试使用你在这里概述的“assign”,它完全满足了我的需求。谢谢! - user1913921
7
警告:当您在函数中使用assign时,其行为与在顶层使用它的行为不同,您迟早需要使用env = .GlobalEnv - user1666959
这是一个很好的建议。如果楼主想要更多关于此的信息,他可以在这里查看。 - Christoph_J
2
最佳实践是使用lapply将所有文件读入一个列表中,而不是在环境中堆积多个对象(进行全局赋值甚至更糟)。 - flodel
谢谢大家对我的问题的回答。我还是对警告不太理解,因为我对R非常新手(之前只用过它进行简单的统计分析,较少用于数据操纵/编程)。但是,看起来我需要好好了解一下“assign”和“lapply”的区别,这是我的作业。谢谢,Katie - user1913921
感谢您回答了OP的问题,而不是仅仅向他讲授最佳实践。有时候最佳实践并不适用于某些任务。我的员工(非IT人员)要求我为一个类似的实际问题编写代码,我找到了一堆只是说最佳实践是什么,但没有提供解决方案的问题和回复。这个答案提供了一个解决方案。 - LuizZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接