使用R将多个文件加载到矩阵中

4

我刚踏入编程的世界,需要帮助将文件加载到R中并创建矩阵。我可以导入单个文件并从中创建单个矩阵。但如何处理多个文件呢?我有21个文件,每个文件都包含100行和100列,我需要导入每个文件并将所有内容放入一个单一的数组。

2个回答

6
  1. I would use list.files to list my files by pattern.
  2. lapply to loop through the list of files and create a list data.frame with read.csv
  3. rbindlist to bind all in a big matrix.

    temp = list.files(pattern="*.csv")
    named.list <- lapply(temp, read.csv)
    library(data.table)
    files.matrix <-rbindlist(named.list)
    

我应该在哪里输入文件路径以访问所需的文件? - user2113499
@user2113499,你可以像这样设置路径:list.files(path='your_files_path',pattern='.*csv') - agstudy
3
或者 lapply(temp, fread)。有一个要求是让 fread 接受多个文件并在其中构建。这样,这4行代码就可以简化为 fread(list.files(pattern="*.csv"))。这样它就可以在开始读取输入之前检查所有输入的格式一致性,因此如果格式不一致,就可以更早地发出错误提示。它还可以通过只分配一次完整的最终大表来使用较少的工作内存,而不是将它们全部分别读取,然后复制到大表中。听起来可以吗? - Matt Dowle
+1 @MatthewDowle 是的,没问题!但是如果文件比你分配的内存还要大怎么办?如果 fread 能够切换到像 ff 包一样处理大型数据集的方式就太好了。 - agstudy
1
真的,但那是另一回事。fread(<multiple files>)在所有方面都比lapply(temp,read.csv)更好。这就是我现在要处理的全部内容。大于RAM的数据留待以后再说。 - Matt Dowle

2
“不太清楚您想要的结构是什么。您可以选择一个2100x100的矩阵、一个2100x100的数据框或一个100x100x21的数组,或者一个包含21个条目的列表,每个条目都是100x100。(在R中,数组是指所有列类型相同的常规三维结构的术语。(当然,agstudy建议您使用data.table。)从某种意义上说,agstudy的代码已经给出了一个由21个数据框组成的列表,每个数据框的维度为100x100。”
temp = list.files(pattern="*.csv")
named.list <- lapply(temp, read.csv)

如果您想获得一个100 x 100 x 21的数组,请继续执行以下操作:

require(abind)
arr <- abind(named.list)

为了获得一个2100 x 100的数据框,可以继续执行以下操作:
longdf <- do.call(rbind, named.list)

要获得2100 x 100的矩阵,请从上一行继续:
longmtx <- data.matrix(longdf)

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