【问题标题】:How to simultaneously use sapply and apply to shorten a multiplicative function in R如何同时使用 sapply 和 apply 来缩短 R 中的乘法函数
【发布时间】:2017-04-20 17:45:48
【问题描述】:

我想知道如何同时使用 sapplylapply 以避免编写名为 GG 的函数,如下所示?

GG = function(x, y) dnorm(250, mean = x, sd = y)*dnorm(265, mean = x, sd = y) *
                    dnorm(259, mean = x, sd = y)

P.S.我知道如果我上面的函数中只有 x 是变化的,以下可能会起作用:

     function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 10), prod)

但就我而言,xy 都不同。

【问题讨论】:

  • 您应该提供完整的上下文。我只是想复制你的 GG 功能

标签: r function lapply sapply


【解决方案1】:

我们可以使用来自base RMapReduce。使用Map 的原因是函数可以应用于传入它的对象的相应元素。这里,dnorm 是一个函数,它将 'x' 和 'y' 的每个对应元素作为 meansd 参数,同时它有一个常量向量 "x" (c(250, 265, 259))。 Map 的输出是list,我们将Reduce 对应的list 元素乘以一个单个元素 (*)

GG1 <- function(x, y) Reduce(`*`, Map(dnorm, x = c(250, 265, 259),
                        mean = list(x), sd = list(y)))
identical(GG(24, 12), GG1(24, 12))
#[1] TRUE

identical(GG(32, 15), GG1(32, 15))
#[1] TRUE

基于 OP 的 cmets,

x <- seq(10,  40, length= 30)
y <- x
z <- outer(x, y, GG1)
persp(x, y, z , theta = 0, phi = 20, expand = 0.5, col = 'pink')

【讨论】:

  • @parvinkarimi 代替outer,尝试使用expand.grid,即z &lt;- matrix(apply(expand.grid(x, y), 1, FUN = function(u) GG1(u[1], u[2])), 30, 30)
  • @parvinkarimi 您还将获得您的功能(如果您尝试过的话)。在这里,'z' 值都是 0(请检查你的函数中的 'z' 输出基数。z &lt;- outer(x, y, FUN = GG); all(z==0)# [1] TRUE
  • @parvinkarimi 我修改了早期的函数,现在它可以与outer 一起使用,但是您基于“x”和“y”的z 值都是0,您必须检查
猜你喜欢
  • 2017-09-24
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多