【问题标题】:Sapply on User Defined FunctionSapply 用户定义函数
【发布时间】:2014-10-06 18:36:09
【问题描述】:

以下是我的问题的简化版本,它比我原来的问题更容易解释。假设我有一个参数向量

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

还有一个名为total的列表定义为

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

现在,假设我想将函数 mean 应用于列表的 3 个元素中的每一个元素,并且每次将结果乘以从 par 中选择的两个参数的函数。但是,要选择的参数会随着sapply 的每次迭代而变化。例如,当我计算列表第一个元素的平均值时,我想将结果乘以sqrt(par[2]*par[3]),而在计算list 中第二个元素的平均值时,我想将结果乘以@987654329 @等……

我知道我可以使用sapply 来获得total 中每个元素的平均值

sapply(total, mean)

但是我如何告诉sapply 对结果进行rolling 乘法?我应该使用rapply 吗?

【问题讨论】:

  • 你不需要那个笨拙的 lapply/unlist 调用。只需sapply(total, mean)。它并不是真正的“滚动”应用程序。您可能应该将您的par 对象改造成一个列表并使用mapply
  • 好点,让我更正一下!
  • 遍历 par 向量的规则是什么?
  • 我需要跳过一个元素,然后选择接下来的两个。然后跳过下一个,挑下面两个以此类推……基本上跳过一个后挑一对连续的参数。

标签: r function user-defined-functions apply sapply


【解决方案1】:

使用回收,您可以过滤您的 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))

【讨论】:

  • 太好了,这正是我需要的!
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2015-06-27
相关资源
最近更新 更多