1

私はMATLABにRに変換する必要のある一連の関数を持っています。残念ながら私はRをそれほどよく知りません。

主なハードルは、それぞれ50x86069のcsv 100ファイルを100、50、86069配列にロードすることです。

配列を開いたり書き込んだりするようにコードを設定してから、ループの一部として各50x86069csvファイルを読み取ります。

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です。の詳細については、HadleyのJSSペーパーを参照してくださいplyr

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に依存する必要がなくなり、 CPU時間とRAMの点で異なるパフォーマンスが示される可能性があります。abindたぶん、いくつかのベンチマークは、その場合にいくつかのガイダンスを与える可能性があります(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 に答える