2012-11-28 44 views
5

Tôi cần một hàm để đặt một mảng đa chiều trong R; bắt là tôi không biết kích thước hoặc chiều dài nào dọc theo kích thước đó cho đến khi hàm được gọi.cấu trúc bảo toàn chỉ mục mảng

# subset a 3-d array; leave dims 1 and 2, but start 3rd dim at its 11th value 
mydim <- dim(myarr) 
myarr[, , 11:mydim[3]] 

# subset a 4-d array; leave dims 1, 3 and 4, but start 2rd dim at its 8th value 
mydim <- dim(myarr) 
myarr[, 8:mydim[2], , ] 

tôi luôn luôn cần phải tập hợp con cùng chính xác một chiều, và Subsetting luôn là bắt đầu tại một số giá trị khác hơn 1. Tôi cũng cần phải duy trì cấu trúc mảng, vì vậy ma trận đánh chỉ số vào mảng không nhìn hấp dẫn. Cảm ơn trước.

+0

Thú vị. Khi bạn nói "bao nhiêu" bạn có nghĩa là bao nhiêu chiều dài dọc theo chiều hướng đó hoặc một cái gì đó khác nhau? –

+0

có, ý tôi là độ dài dọc theo kích thước –

+0

Tôi woukld đề xuất danh sách() cho loại hoạt động này –

Trả lời

1

Dưới đây là một lựa chọn mà có lợi thế về khả năng Subsetting một mảng dựa trên một ma trận:

myarr <- array(1:(2*3*4), dim = c(2, 3, 4)) 

myfun <- function(arr, from, len, Dim){ 
    dimArr <- dim(arr) 
    if(missing(len)){ 
     subIdx <- from:dimArr[Dim] 
    } else { 
     subIdx <- from:(from + len - 1) 
    } 
    arrD <- lapply(as.list(dimArr), seq_len) 
    arrD[[Dim]] <- subIdx 
    subMat <- as.matrix(do.call(expand.grid, arrD)) 
    array(arr[subMat], dim = lapply(arrD, length)) 
} 

> myfun(myarr, 2, 1, 3) 
, , 1 

    [,1] [,2] [,3] 
[1,] 7 9 11 
[2,] 8 10 12 

> myfun(myarr, 2, Dim = 3) 
, , 1 

    [,1] [,2] [,3] 
[1,] 7 9 11 
[2,] 8 10 12 

, , 2 

    [,1] [,2] [,3] 
[1,] 13 15 17 
[2,] 14 16 18 

, , 3 

    [,1] [,2] [,3] 
[1,] 19 21 23 
[2,] 20 22 24 
+0

@JackTanner, chỉ cần nhìn thấy (và hiểu một cách khác nhau) các "chiều dài dọc" bình luận. Nếu bản chỉnh sửa không làm những gì bạn muốn, vui lòng thông báo! – BenBarnes

1

Đây rồi! Kiểm tra quá ...

sampleArray <- function(myarr, dm, start, leng) { 
    ## arguments: 
    ## dm is the dimension selected 
    ## start is where in dm to being 
    ## leng is how far in from dm to go 
    ## start+leng <= dim(myarr)[dm] 

    leng <- leng-1 

    # error check 
    if (start+leng > dim(myarr)[dm]) 
     warning("leng too long by ", start+leng - dim(myarr)[dm], ".") 

    #initialize a vector of all TRUE 
    indx <- as.list(rep(TRUE, length(dim(myarr)))) 

    # change the required dimension to the required sequence 
    indx[[dm]] <- seq(start, start+leng) 
    indx <- paste(indx, collapse=",") 

    expr <- paste0("myarr[", indx, "]") 

    # return the appropriate sample 
    eval(parse(text=expr)) 
    } 

dụ:

# sample array 
myarr <- array(1:2250, dim=c(15, 10, 15)) 

# example call 
sampleArray(myarr, dm=2, start=4, leng=3) 
+0

không hoạt động: indx là một vectơ, và thay đổi giá trị thứ 3 của nó sang một véc-tơ khác không thành công với "số lượng mục cần thay thế không phải là bội số của độ dài thay thế " –

+0

@Jack Tanner - chỉ cần chỉnh sửa nó. Nó sẽ hoạt động ngay bây giờ –

+0

Nó gần như hoạt động! Ý bạn là start + leng-1. Tôi chấp nhận câu trả lời khác bởi vì nó là lỗi miễn phí, nhưng cảm ơn đã cho tôi thấy một lựa chọn tốt đẹp. –

Các vấn đề liên quan