2016-10-25 24 views
0

我想在矩陣的一個邊界(在我的示例中爲列)上應用函數。問題是該函數返回矩陣,並且apply將其轉換爲向量,以便它返回一個矩陣。我的目標是獲得三維數組。這裏是例子(注意matrix()不感興趣的功能,只是一個例子):從矩陣轉換爲向量的輸出應用

x <- matrix(1:12, 4, 3) 
apply(x, 2, matrix, nrow = 2, ncol = 2) 

輸出是完全一樣的輸入。我有非常沉悶的解決方案:

library(abind) 
abind2 <- function (x, ...) 
    abind(x, ..., along = dim(x) + 1) 
apply(x, 2, list) %>% 
    lapply(unlist) %>% 
    lapply(matrix, nrow = 2, ncol = 2) %>% 
    do.call(what = 'abind2') 

我相信肯定存在比這更好的東西。某些東西不包括list() ing和unlist()列。


編輯: 此外,該解決方案應該準備容易適用於具有的MARGIN任何選擇哪種我的解決方案是不屬於任何一維數組。例如,我想返回4維數組。

x <- array(1:24, c(4,3,2)) 
apply(x, 2:3, list) %>% 
    lapply(unlist) %>% 
    lapply(matrix, nrow = 2, ncol = 2) %>% 
    do.call(what = 'abind2') 
+0

與第一個示例相同 –

+0

'abind :: abind()' –

+0

另請參閱[此問題](http://stackoverflow.com/q/13811133/4137985) – Cath

回答

4

沒有那麼複雜。只需使用

array(x, dim = c(2, 2, ncol(x))) 

矩陣和常規數組按物理地址按列存儲到一維長陣列中。您可以重新分配維度。


OK,這裏可能是你想在一般做什麼:

tapply(x, col(x), FUN = matrix, nrow = 2, ncol = 2) 

#$`1` 
#  [,1] [,2] 
#[1,] 1 3 
#[2,] 2 4 
# 
#$`2` 
#  [,1] [,2] 
#[1,] 5 7 
#[2,] 6 8 
# 
#$`3` 
#  [,1] [,2] 
#[1,] 9 11 
#[2,] 10 12 
+0

示例函數'matrix()'不是感興趣的功能。這只是返回我能想象的矩陣的最簡單的函數。我明白這可能會令人困惑 - 將編輯該問題。 –

+0

當'x'是'array'時,這將不起作用 – Cath

2

您可以嘗試轉換您的matrixdata.frame,並使用lapply適用於columns你的函數(作爲data.framelist),它將返回list,其中每個元素表示column的函數結果:

lapply(as.data.frame(x), matrix, nrow = 2, ncol = 2) 

    # $V1 
     # [,1] [,2] 
    # [1,] 1 3 
    # [2,] 2 4 

    # $V2 
     # [,1] [,2] 
    # [1,] 5 7 
    # [2,] 6 8 

    # $V3 
     # [,1] [,2] 
    # [1,] 9 11 
    # [2,] 10 12  

編輯與x的第二個定義:

x <- array(1:24, c(4,3,2)) 
lapply(as.data.frame(x), matrix, nrow = 2, ncol = 2) 
# $V1 
    # [,1] [,2] 
# [1,] 1 3 
# [2,] 2 4 

# $V2 
    # [,1] [,2] 
# [1,] 5 7 
# [2,] 6 8 

# $V3 
    # [,1] [,2] 
# [1,] 9 11 
# [2,] 10 12 

# $V4 
    # [,1] [,2] 
# [1,] 13 15 
# [2,] 14 16 

# $V5 
    # [,1] [,2] 
# [1,] 17 19 
# [2,] 18 20 

# $V6 
    # [,1] [,2] 
# [1,] 21 23 
# [2,] 22 24 

EDIT2:一個試圖得到一個ARRY作爲結果

基於this similar question,你可以試試這個代碼:

x <- array(1:24, c(4,3,2)) 
sapply(1:3, 
     function(y) sapply(1:ncol(x[, y, ]), 
          function(z) matrix(x[,y,z], ncol=2, nrow=2), 
          simplify="array"), 
     simplify="array") 

結果的尺寸是2 2 2 3

實際上,這裏的問題是當x是一個超過2維的數組時,它需要應用兩個不同的調用。在問題的最後一個例子中(使用x <- array(1:24, c(4,3,2))),我們希望將適用於第二維的每個元素的函數應用於第三維的每個元素矩陣函數。

+0

這是我的第一個想法,但它很難被擴展。看到我的編輯 –

+0

所以我想我必須在apply()調用 –

+0

之後不斷重新調整數組的大小,所以在數組中切入比較容易。 'X [1,]' –