我试图根据矩阵A的值计算矩阵B(对于每一列)的条件标准差。
#conditional function
foo<-function(x,y)
{
out<-sd(y[abs(x)==1])
return(out)
}
#create the matrix
A<-matrix(data=c(1,-1,0,1,0,0,0,0,1,1),nrow=5,ncol=2)
B<-matrix(data=c(3,4,5,6,7,8,9,10,11,12),nrow=5,ncol=2)
#run for the first column
foo(A[,1],B[,1])
#run for both columns
apply(X=A, MARGIN=2, FUN=function(x,y) foo(x,y), y=B)
正确的答案是1.53和0.707,当我直接为每一列直接运行foo时,我得到了。
但是,当我尝试使用apply运行两个列时,我得到此结果3.06 2.94。
任何想法如何更改应用以使其工作因为我有一个大的资产矩阵(在xts对象中)。目前,我正在使用for循环,但我相信它可以通过更有效的方式完成。
提前谢谢你,
尼科斯
答案 0 :(得分:4)
您的方法存在的问题是,您尝试将矩阵(B
)传递给函数foo
,该函数需要两个向量(x
和{{1} })。
你可以尝试这样的事情:
y
这基本上只是一个循环...
另一种方法是,如果您的sapply(1:ncol(A), function(i) sd(B[as.logical(abs(A[,i])),i]))
[1] 1.5275252 0.7071068
和A
对象是数据框,则可以使用B
:
mapply
对这两种方法进行基准测试,A <- as.data.frame(A)
B <- as.data.frame(B)
mapply(foo, A,B)
V1 V2
1.5275252 0.7071068
路线的速度可能是原来的两倍。我可以想象这是因为sapply
只是将整数向量作为参数和处理矩阵,而sapply
方法将数据帧作为参数(数据帧比矩阵慢,并且传递循环的信息更多)而不只是一个索引值)。详细说明:
mapply