2014-07-16 66 views
0

我在R中的「應用」類型函數掙扎。 我有一個矩陣,我想要的是使用矩陣的每一行的元素,使用一個用戶 - 定義函數根據矩陣的輸入進行一些計算,並創建一個新的函數來存儲這些計算的結果。使用矩陣的每一行中的元素應用函數

我已經找到了如何做到這一點,當函數返回只有一個輸出

因此,例如,假設矩陣A和執行某種計算的函數。

> A=matrix(1:16,nrow=4) 
> A 
    [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 

> B=apply(A,1,FUN=function(x) x[1]**2+2*x[2]+x[3]*x[4]) 
> B 
[1] 128 156 188 224 

我所需要的是在輸出多於一個元素的向量的情況下延伸這一點,想象例如,我想計算的三個不同多項式來代替一個值如示例並再次獲得將包含這三個多項式的計算的4×3矩陣。

目前,我正在用一個「for」循環來做這件事,循環逐行讀取數據,執行函數並將結果存儲在一個新的矩陣中,但速度很慢。 一個例子是:

A=matrix(1:16,nrow=4) 
A 
    [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 
calc=function(e1,e2,e3,e4){ 
    x1=e1*e2+3*e3*e4 
    x2=e4+e2+5*e3**2-e4 
    x3=e1*e2*e3*e4 
    return(c(x1,x2,x3)) 
} 

results=matrix(nrow=4,ncol=3) 

for (i in 1:4){ 
    k=calc(A[i,1],A[i,2],A[i,3],A[i,4]) 
    results[i,]=k 
} 

results 
    [,1] [,2] [,3] 
[1,] 356 410 585 
[2,] 432 506 1680 
[3,] 516 612 3465 
[4,] 608 728 6144 

的,我怎麼能採用類似操作,以避免基質的「爲」任何想法都歡迎。 (我沒有限制到應用程序包)

+0

如果您包括您'for'循環可能更容易弄清楚如何使用'apply'重寫。 – janos

+0

我擴展了結果 – KGeor

回答

3

你的函數在apply框架中不起作用,因爲函數應該有一個向量作爲它的參數,而不是單獨的值。如果您在函數中指定的值,將工作:

calc=function(row){ 
    e1 = row[1]; e2 = row[2]; e3 = row[3]; e4 = row[4] 
    x1=e1*e2+3*e3*e4 
    x2=e4+e2+5*e3**2-e4 
    x3=e1*e2*e3*e4 
    return(c(x1,x2,x3)) 
} 

應用函數會返回一個完整的矩陣,但它會明智創建這個矩陣列。所以第一行的結果將被存儲到第一列中,等等。這通過轉換結果很容易解決。

t(apply(A, 1, calc)) 
+0

它工作的很棒!非常感謝 – KGeor

0
apply(A,1,FUN=function(x){ 
    y<-rep(NA,3) 
    y[1]=x[1]+1 
    y[2]=x[2]+x[3] 
    y[3]=x[4]/2 
    return(t(y)) 
    } 
    ) 

這對我有效。很顯然,編輯y [1],y [2],y [3]的函數,如果你想要多於3,也可以編輯線y<-rep(NA,3)

2

不知道這是否有助於:

fun1 <- function(mat){ 
x1 <- mat[,1]*mat[,2]+3*mat[,3]*mat[,4] 
x2 <- mat[,4]+mat[,2]+5*mat[,3]**2-mat[,4] 
x3 <- mat[,1]*mat[,2]*mat[,3]*mat[,4] 
    cbind(x1,x2,x3) 
    } 
fun1(A) 
#  x1 x2 x3 
# [1,] 356 410 585 
# [2,] 432 506 1680 
# [3,] 516 612 3465 
# [4,] 608 728 6144 
相關問題