2016-02-03 66 views
0

我遇到命令apply的問題,我不明白爲什麼我的解決方案不起作用。R在陣列上應用函數

假設我有一個名爲$ A $的矩陣,其維數爲$ m \ times n $。我想對它的每個元素應用一個函數,所以我使用B < -apply(A,c(1,2),函數)。這工作,我有我的結果在維度$ m \ times n $的另一個矩陣。

不,我想將這些結果安排在$ C $的維數$ m \ times n \ times k $中。

如果我寫了類似C [,, 1] < -apply(A,c(1,2),函數)或甚至C [,, 1] < -B,它不起作用,我最終與dim(C)= NULL。

我真的不知道這裏發生了什麼,如果需要的話我會發布我使用的特定代碼,但我認爲這個問題可能與應用有關。

編輯:代碼

LTV<-pxt_CBD_male 
LTV[,,]<-0 
LTV=LTV[,,1:6] 
dimnames(LTV)[[3]]<-c("0.00","-0.02","-0.04","-0.06","-0.08","-0.10") 
> dim(LTV) 
[1] 36 50 6 
> class(LTV) 
[1] "array" 


p=0.05 
etalim=qnorm(1-p,mean=ext_mean_male[,],sd=ext_sd_male[,]) 
> dim(etalim) 
[1] 36 50 
> class(etalim) 
[1] "matrix" 

r<-0.015 
c<--(0.00) 
l1<-0.025 
l2<-0.005 
nstep<-100 
H<-c() 
H[1]=100 
z<-c(seq(0,nstep)) 
y<-z[z!=nstep] 
for(t in 1:nstep){ 
    H[t+1]=H[t]*(1+c) 
} 

LTVfunction<-function(x){ 
    y1=H[trunc(x)] 
    y2=H[trunc(x)+1] 
    x1=trunc(x) 
    x2=trunc(x)+1 
    y=((x-x1)/(x2-x1))*(y2-y1)+y1 
    value=y/(1+r+l1)^x 
    return(value) 
} 

現在的問題就出現了。第一個作品,第二個沒有:

LTV1<-apply(etalim,c(1,2),LTVfunction) 
> dim(LTV1) 
[1] 36 50 
> class(LTV1) 
[1] "matrix" 
LTV[,,1]<-apply(etalim,c(1,2),LTVfunction) 
> dim(LTV) 
NULL 
> class(LTV) 
[1] "list" 
+1

「,如果它需要我會發布具體的代碼我使用「,是的請。這就是你如何提出好問題並獲得快速答案 – Ananta

+0

完成,感謝您的輸入 – Arpayon

回答

0

我會預先分配的數組,然後分配給它:

tmp <- matrix(rnorm(100), 10, 10) 

out <- array(0, dim = c(dim(tmp), 3)) 

out[,,1] <- apply(tmp, c(1, 2), function(x) x + 1) 
out[,,2] <- apply(tmp, c(1, 2), function(x) x - 1) 
+0

在你的例子中我根本不會使用循環。 – Roland

+0

當OP在首次發帖時沒有提供示例時,我不會花太多時間想出一個現實的答案。我也不會使用循環進行矢量化 – Zelazny7