mapply基础知识? - 如何从两个向量和一个函数创建矩阵

Sam*_*ift 6 r matrix mapply

我正在尝试创建一个data.frame,从中创建一个图形.我有一个函数和两个向量,我想用作两个输入.这有点简化,但基本上我只有:

relGPA <- seq(-1.5,1.5,.2)
avgGPA <- c(-2,0,2)

f <- function(relGPA, avgGPA) 1/(1+exp(sum(relGPA*pred.model$coef[1],avgGPA*pred.model$coef[2])))
Run Code Online (Sandbox Code Playgroud)

我想要的是一个data.frame,其中avgGPA值有3列,relGPA值有16行,单元格中有结果值.

我为这是多么基本道歉,但我向你保证,我试图在没有你帮助的情况下实现这一目标.我已经尝试过关于sapply和mapply手册页的示例,但是我只是对R来说有点太新了,看看我正在尝试做什么.

谢谢!

42-*_*42- 4

无法使用所提供的信息进行测试,但这应该有效:

expGPA  <- outer(relGPA, avgGPA, FUN=f) # See below for way to make this "work"
Run Code Online (Sandbox Code Playgroud)

当您想要生成组合时另一个有用的函数是expand.grid,这将为您提供“长形式”:

expGPA2 <-expand.grid(relGPA, avgGPA)
expGPA2$fn <- apply(expGPA2, 1, f)
Run Code Online (Sandbox Code Playgroud)

长格式是lattice和ggplot期望作为更高级别绘图的输入格式。

编辑:可能需要构造一个更具体的方法来将列引用传递给函数,如 djhurio 所指出的和 Sam Swift 使用该Vectorize策略(已解决)。在 的情况下apply,该sum函数可以像上面描述的那样开箱即用,但除法运算符则不然,因此这里是另一个示例,可以推广到具有多个参数的更复杂的函数。程序员所需要的只是“apply()”-ed”函数中适当参数的列号,因为(不幸的是)列名没有传递给参数x

> expGPA2$fn <- apply(expGPA2, 1, function(x) x[1]/x[2])
> str(expGPA2)
'data.frame':   48 obs. of  3 variables:
 $ Var1: num  -1.5 -1.3 -1.1 -0.9 -0.7 ...
 $ Var2: num  -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 ...
 $ fn  : num  0.75 0.65 0.55 0.45 0.35 ...
 - attr(*, "out.attrs")=List of 2
  ..$ dim     : int  16 3
  ..$ dimnames:List of 2
  .. ..$ Var1: chr  "Var1=-1.5" "Var1=-1.3" "Var1=-1.1" "Var1=-0.9" ...
  .. ..$ Var2: chr  "Var2=-2" "Var2= 0" "Var2= 2"
Run Code Online (Sandbox Code Playgroud)

Edit2:(2013-01-05)一年后看到这一点,我意识到 SamSwift 的函数可以通过使其主体使用“+”而不是进行矢量化sum

 1/(1+exp( relGPA*pred.model$coef[1] + avgGPA*pred.model$coef[2]) # all vectorized fns
Run Code Online (Sandbox Code Playgroud)