2014-10-06 109 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