我有以下代码,它通过文件夹中的文件列表,并将每个文件读入一个基于原始文件名命名的数据框:
myfiles = list.files(pattern="*.avg")
for (file in myfiles){
dataname = paste("S",gsub("_","",gsub("\\.avg", "", file)), sep = "")
assign(dataname, read.table(file, header = FALSE, col.names = c("wl","ref","sd")))
}
我的问题是,一旦我将100个数据帧读入R,我就无法使用变量dataname直接访问它们,因为这是一个字符串,例如" dataframe1" ....我希望有循环中的另外几个语句用于处理每个数据帧,因此需要访问数据帧。关于如何做到这一点的任何想法?
答案 0 :(得分:3)
扩展@ arvi1000的建议,您可以直接将文件读入列表:
myfiles = list.files(pattern="*.avg")
file.list = sapply(myfiles, read.table, header=FALSE, col.names=c("wl","ref","sd"))
现在,列表中的每个元素都是一个数据框,列表中每个元素的名称是该列表元素中存储的数据框原点的文件名。
如果您要处理每个文件,也可以在sapply
内执行此操作。例如:
file.list = sapply(myfiles, function(file.name) {
df = read.table(file.name, header=FALSE, col.names=c("wl","ref","sd"))
df$file.name = file.name # Add name of origin file as a new column
... additional data frame processing statements ...
})
您的想法是,您只需执行所需的所有数据清理/处理等,然后每个清理/处理的数据框将成为列表的元素。在上面的示例中,我添加了一个列,其中包含给定数据框来自的文件的名称。如果您想将所有数据帧组合到一个数据框中,但是能够分辨出给定行来自哪个文件,这可能很有用。在这种情况下,在将数据帧读入列表后,您可以将它们组合成单个数据帧,如下所示:
my_df = do.call(rbind, file.list)