1

我在 MATLAB 中有一系列函数需要转换为 R。不幸的是,我不太了解 R。

一个主要障碍是将每个 50x86069 的 csv 100 文件加载到 100、50、86069 数组中。

我将代码设置为打开/写入数组,然后将每个 50x86069 csv 文件作为循环的一部分读取。

l <- list.files(inputs)
data.array<-array(0,dim=c(100,50,86069))

# loop through the input files to get the data loaded into an array
for(i in 1:5)
in.file <- read.csv(paste(inputs,"/",l[[i]], sep = ""))

    in.file = in.file[,-1] ## remove the first column

现在我需要将 in.file 放入 data.array(i,50,86069)。

任何帮助将不胜感激!

谢谢-

4

2 回答 2

3

您可以很容易地利用包中的laply功能plyr来获得所需的结果:

list_csv = list.files("/path/to/csv_files/", pattern = "csv")
muli_dim_array = laply(list_csv, read.csv)

laply函数将函数应用于read.csv列表list_csv并产生一个数组作为结果,因此函数名称为laply。有关. _ _plyr

对于rbind可扩展到多个维度 (>2) 的类似函数,请查看包中的abind函数abind。使用abindand的解决方案lapply

list_arrays = lapply(list_csv, read.csv)
n = length(dim(list_arrays[[1]]))
multi_dim_array = do.call("abind", list_arrays, along = n + 1)

这消除了对plyr(但依赖于abind:))的需要,并且可能在 CPU 时间和 RAM 方面表现出不同的性能。在这种情况下,也许一些基准可以提供一些指导(还包括for@Roman 的基于循环的解决方案)。

归根结底,我真的很喜欢 的简短、中肯的语法plyr,我会首先尝试该解决方案。

于 2012-10-09T10:31:08.547 回答
2

你在寻找这样的东西吗?

> ar1 <- array(1:9, dim = c(3, 3))
> ar1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> ar2 <- array(10:18, dim = c(3, 3))
> ar3 <- array(19:27, dim = c(3, 3))
> ar.list <- list(ar1, ar2, ar3)
> bigarray <- array(NA, dim = c(3, 3, 3))
> for (i in 1:3) {
+     
+     intr <- vector("list", 3)
+     for(j in 1:3) {
+         intr[[j]] <- ar.list[[j]][i, ]
+     }
+     bigarray[, , i] <- do.call("rbind", intr)
+ }
> bigarray
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]   10   13   16
[3,]   19   22   25

, , 2

     [,1] [,2] [,3]
[1,]    2    5    8
[2,]   11   14   17
[3,]   20   23   26

, , 3

     [,1] [,2] [,3]
[1,]    3    6    9
[2,]   12   15   18
[3,]   21   24   27
于 2012-10-09T08:06:06.313 回答