读取并组合多个文件的每一行,并对该组合运行一个函数(以块的形式?)[R]

问题描述 投票:0回答:1

我有一个在 R 中阅读/组合的有点复杂的场景,我不确定如何解决这个问题。

文件概述: N 个文件,每个文件具有相同的 Y 列和 Z 行,但数据不同。每个文件的列中都有不同的数字整数。

组合概览: 在每一行,都会有一个来自以下拉链式组合的矩阵输出:每列是每个文件的行,形成 N 列,其中每列匹配一个文件。所以,它是一个 YxN 大小的矩阵,最终有 Z 个。

在此阶段,每个矩阵都用作要按输入文件的每一行的顺序处理的函数的输入的一部分。

现在,有一些方法可以强制执行此操作,即一次读取所有内容并处理数据,但数据太大,效率不高。有没有一种好方法可以使用 R 中的块以这种方式有效地读取和组合文件?最重要的是将内存使用量保持在最低限度。

对缺少格式表示歉意……此处 N=4、Y=10 和 Z=50

generate_matrix <- function() {
    matrix(sample(0:2, 50*10, replace = TRUE), nrow = 50, ncol = 10)
}
orig_matrices <- replicate(4, generate_matrix(), simplify = FALSE)
after_combination <- lapply(1:50, function(i) do.call(cbind, lapply(orig_matrices, function(x) x[i,])))

after_combination 是 50 个 10x4 矩阵的列表

r multithreading io
1个回答
0
投票

假设您有一个名为

orig_matrices
的文件夹,仅包含 N 个输入文件,例如
m1.csv
m2.csv
m3.csv
...
mn.csv

然后您可以执行以下操作

p=list(N=4, Y=10, Z=50)

lapply(1:p$Z, \(i) {

  cmd = paste0("awk 'FNR==", i, "{print;nextfile}' m*.csv > ac", i,".csv")
  system(command = cmd)
  d = t(fread(paste0("ac", i, ".csv")))
  # < do something with d >
})
© www.soinside.com 2019 - 2024. All rights reserved.