我正在努力应对"申请" 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
我需要的是在输出是多个元素的向量的情况下扩展它,想象例如我想要计算三个不同多项式的值而不是如示例中的一个,并再次获得4x3矩阵,包含这三个多项式的计算。
暂时我正在使用" 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
关于如何将类似操作应用于矩阵的任何想法,避免使用" for"非常欢迎。 (我不受限于申请套餐)
答案 0 :(得分:3)
您的函数在apply框架中不起作用,因为函数应该有一个vector作为参数,而不是单个值。如果在函数中指定值,它将起作用:
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))
}
apply函数将返回一个完整的矩阵,但是它将以列方式创建该矩阵。因此第一行的结果将存储到第一列等中。这可以通过对结果进行转置来轻松解决。
t(apply(A, 1, calc))
答案 1 :(得分: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
答案 2 :(得分: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)