2012-10-09 2 views
1

R로 변환해야하는 MATLAB의 일련의 함수가 있습니다. 불행히도 R을 잘 모릅니다.을 사용하여 3 차원 배열에 데이터 추가 R

큰 장애물은 50x86069 인 csv 100 파일을 100, 50, 86069 배열로로드하고 있습니다.

배열을 열고 쓰도록 코드를 설정 한 다음 각 50x86069 csv 파일을 루프의 일부로 읽습니다.

이제 in.file을 data.array (i, 50,86069)에 넣어야합니다.

도움이 될 것입니다.

감사합니다.

+0

재현 가능한 예는 먼 길을 갈 것입니다. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+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 
+0

나는 'laply'가 좀 더 느리고 더 많은 메모리를 소비 할지라도 구문의 관점에서'laply' 버전을 더 좋아합니다. –

+1

... 그리고 나는 당신의 경우에'abind' 함수가 정말 잘 작동한다고 생각합니다. –

+0

@PaulHiemstra 나는 이것이 우리가 원하는 결과라고 확증 할 필요가 있다고 생각한다. :) 끝까지 주셔서 감사합니다. 나는 뭔가를 놓쳤다는 것을 알았습니다. –

3

당신은 아주 쉽게 당신이 필요로하는 결과를 얻기 위해 plyr 패키지에서 laply 기능을 활용할 수 있습니다 :

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

laply 기능 목록 list_csv에 기능 read.csv를 적용하고 결과 배열을 산출 따라서 함수 이름은 la ply입니다. plyr에 대한 자세한 내용은 해들리의 JSS paper을 참조하십시오.

rbind과 같이 여러 차원 (> 2)의 배율을 갖는 함수의 경우 abind 패키지의 abind 함수 형태를 살펴보십시오. abindlapply를 사용하는 솔루션 :이 plyr에 대한 필요성을 제거한다 (그러나 :) abind에 의존), 및 CPU 시간과 RAM의 측면에서 다른 성능을 표시 할 수 있습니다

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

. 어쩌면 일부 벤치 마크에서는이 경우에 대한 지침을 줄 수 있습니다 (@Roman의 루프 기반 솔루션 for 포함).

하루가 끝날 무렵, 나는 plyr의 짧은 - 투 - 포인트 구문을 정말 좋아하며, 나는 그 해결책을 먼저 시도 할 것입니다.

+0

Paul and Roman - 귀하의 통찰력에 대해 감사드립니다. 두 가지 솔루션 모두 잘 작동했지만 Roman의 것이 내 요구에 더 적합 할 수도 있습니다. 로마의 접근 방식을 사용하는 것이 하나의 질문입니다. 각 입력 변수에서 첫 번째 열을 어떻게 제거 할 수 있습니까? 두 번째 질문은 입력 데이터가 1보다 큰 값을 ar [ar> 0] <- 1 과 같이 필요로한다는 것입니다. 둘 다 같은 루프에 적용되지만 상상할 수는 없다고 생각합니다. 이것을 오류없이 얻을 수 있습니다. 감사합니다. – user1553041

관련 문제