2014-07-16 67 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 
相关问题