2014-10-06 184 views
0

下面是我的問題的簡化版本,比我的原始版本更容易解釋。假設我定義爲用戶自定義函數的用法

total 
[[1]] 
[1] 0.2 0.6 0.8 0.3 0.9 

[[2]] 
[1] 0.2 0.6 0.8 0.3 0.9 0.2 0.8 0.3 0.9 0.2 0.6 0.3 0.9 

[[3]] 
[1] 0.2 0.6 0.8 0.3 0.9 0.2 0.8 0.3 0.9 0.2 0.6 0.3 0.9 

現在的參數

par<-c(0.2,0.5,0.7,0.3,0.9,1,1.2,1.8,1.5)

一個載體,一個叫total列表,可以說,我想給函數mean適用於3個元素中的每一個並且每次將結果乘以從par中選擇的兩個參數的函數。但是,要選擇的參數隨着每次迭代sapply而改變。例如,當我計算列表第一個元素的平均值時,我想將結果乘以sqrt(par[2]*par[3]),而在計算list中第二個元素的平均值時,我想將結果乘以sqrt(par[5]*par[6])等等。

我知道我可以做

sapply(total, mean)

使用sapply獲得每個元素的平均中total但我怎麼告訴sapplyrolling乘法結果?我應該使用rapply嗎?

+0

您不需要那個笨手笨腳的/無名的電話。只是'sapply(總的,卑鄙的)'。這不是真正的「滾動」應用程序。你可能應該將'par'對象改成列表並使用'mapply'。 – 2014-10-06 18:47:48

+0

好點,讓我改正! – 2014-10-06 18:48:54

+0

遍歷你的par向量的規則是什麼? – agstudy 2014-10-06 19:05:55

回答

2

使用循環使用可以過濾您的par向量,跳過一個元素然後選擇下一個元素。

par <- c(0.2,0.5,0.7,0.3,0.9,1,1.2,1.8,1.5) 
xx <- par[c(FALSE,TRUE,TRUE)] 

然後tapply由每對分裂矢量XX和計算SQRT:

sqrt_xx <- 
tapply(xx,rep(1:(length(xx)/2),each=2),function(x)sqrt(prod(x)))) 

然後,使用mapply

mapply(function(x,y)mean(x)*y, ,total,sqrt_xx) 
0.3313005 0.5108295 0.8847826 

其中總是:

dput(total) 
list(c(0.2, 0.6, 0.8, 0.3, 0.9), c(0.2, 0.6, 0.8, 0.3, 0.9, 0.2, 
0.8, 0.3, 0.9, 0.2, 0.6, 0.3, 0.9), c(0.2, 0.6, 0.8, 0.3, 0.9, 
0.2, 0.8, 0.3, 0.9, 0.2, 0.6, 0.3, 0.9)) 
+0

太好了,那正是我需要的! – 2014-10-06 21:47:46