R使用变量作为数据帧名称,然后访问数据帧

时间:2015-12-16 18:17:57

标签: r loops dataframe

我有以下代码,它通过文件夹中的文件列表,并将每个文件读入一个基于原始文件名命名的数据框:

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" ....我希望有循环中的另外几个语句用于处理每个数据帧,因此需要访问数据帧。关于如何做到这一点的任何想法?

1 个答案:

答案 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)