2012-06-14 97 views
2

是否可以使用二維二進制數組選擇一個三維數組的子集?我想能夠做到這一點,以便我可以將值推入選區用m維數組選擇N維數組的子集?

例如,我有一個數組dim(a)=(lat,long,time),並且我想用dim(b )=(lat,long)這是一個充滿TRUE/FALSE值的數組。我希望能夠做一些事情,如:

> a <- array(c(1,2,3,4,5,6,7,8),c(2,2,2)) 
> b <- matrix(c(0,1,0,0), c(2,2))==TRUE 
> a[[b]] <- 0 
> a 
, , 1 
    [,1] [,2] 
[1,] 1 3 
[2,] 0 4 

, , 2 
    [,1] [,2] 
[1,] 5 7 
[2,] 0 8 

編輯:好吧,這看起來像一個愚蠢的問題,我只是意識到它的工作原理完全如上所述,如果使用a[b] <- 0(單支架)。但是,只有當你想要跨度的維度是最後的維度時纔有效。所以,爲了讓它更有趣:

如果你想跨越的維度是第一維或第二維,你如何做到這一點 - 例如,如果dim(b)==(lat,years)?

+0

爲什麼不簡單地使用'a [1,,]'或者像'a [1:2,1]'這樣的變體? – Andrie

+0

@Andrie:因爲我還沒有把頭圍住它。我會試試:) – naught101

+0

啊,好的。我與你在一起時發現很難將頭圍在矩陣上。我會給我的答案添加一個例子。 – Andrie

回答

4

R支持與[操作者陣列的矩陣子集(即單托架,而不是雙 - 雙托架將總是隻返回單個元素):

a[b] <- 0 
a 

, , 1 

    [,1] [,2] 
[1,] 1 3 
[2,] 0 4 

, , 2 

    [,1] [,2] 
[1,] 5 7 
[2,] 0 8 

注意,這是多少有些與您在問題中指定的結果不同。在你的問題中,第二個元素(即矩陣的左下角元素)是1,因此你會期望每個數組片的第二個元素被修改。 (換句話說,不是第一個,就像你在例子中那樣)。

+0

嗨安裏,我剛剛發佈之前就已經放棄了,並編輯了我的問題。你回答當然是對的,謝謝。我已經延長了這個問題,使它不那麼愚蠢:D。 (並感謝您指出錯誤,我會改正這一點)。 – naught101