【问题标题】:add data to a 3-d array using R使用 R 将数据添加到 3-d 数组
【发布时间】:2012-09-29 10:51:08
【问题描述】:

我在 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)。

任何帮助将不胜感激!

谢谢-

【问题讨论】:

  • 一个可重复的例子将有很长的路要走。 stackoverflow.com/questions/5963269/…
  • 这个问题还在吗?如果任何答案解决了您的问题,请将其标记为已回答(得分下方的绿色复选标记)或提供有关您所需输出的更多详细信息。

标签: r loops plyr multidimensional-array


【解决方案1】:

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

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 的更多详细信息,请参阅 Hadley 的 JSS paper

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

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 方面表现出不同的性能。在这种情况下,也许一些基准可以提供一些指导(还包括@Roman 的基于循环的for 解决方案)。

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

【讨论】:

  • Paul 和 Roman - 非常感谢您的洞察力。虽然这两种解决方案都运作良好,但我认为 Roman 的可能更适合我的需求。我的一个问题是使用 Roman 的方法,如何从每个输入 ar 变量中删除第一列?第二个问题是输入数据将需要大于 1 的值才能成为 1 之类的 ar[ar>0]
【解决方案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

【讨论】:

  • 在语法方面我更喜欢laply 版本,尽管laply 可能会慢一些并且消耗更多内存。
  • ...我认为 abind 函数在您的情况下会非常有效。
  • @PaulHiemstra 我认为我们首先需要确定这是预期的结果。 :) 感谢有关 abind 的提示,我知道我错过了一些东西。
  • 两种解决方案都有效,但 Roman 的解决方案对于我正在加载的大型数据集效果更好。感谢您的帮助!
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
相关资源
最近更新 更多