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

7

我试图创建一个数据框,以便创建一个图表。我有一个函数和两个向量作为两个输入。这里简化了一些,但基本上我只有:

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])))

我只需要一个包含3列avgGPA值和16行relGPA值的数据框,其中单元格中包含相应的结果。

非常抱歉这个问题很基础,但是我向您保证,在没有您的帮助下我已经尝试过了。我曾试图按照sapply和mapply手册上的示例进行操作,但是由于我对R还不够熟悉,所以无法看到我要做什么。

谢谢!

1个回答

4

无法根据提供的信息进行测试,但是以下内容应该可行:

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

如果你想生成组合,另一个有用的函数是expand.grid,它会给你“长形式”:

expGPA2 <-expand.grid(relGPA, avgGPA)
expGPA2$fn <- apply(expGPA2, 1, f)

长格式是lattice和ggplot所期望的更高级别绘图的输入格式。
编辑:可能需要构建一个更具体的方法来将列引用传递给函数,正如djhurio指出的那样,并且通过Sam Swift的Vectorize策略已得到解决。在apply的情况下,如上所述,sum函数可以直接使用,但除法运算符则不能,因此这里提供了一个进一步的示例,可以推广到具有多个参数的更复杂函数。所有程序员需要的是适当参数的列号"apply()"函数,因为(不幸的是)列名不会传递到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"

编辑2:(2013-01-05)一年后再看这个问题,我意识到SamSwift的函数可以向量化,通过使用“+”而不是sum来实现:

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

1
f 必须是一个向量化的函数才能在 outer 中使用。而 apply 不是这样工作的。请查看我的编辑。 - djhurio
1
谢谢DWin,那个方法很好用,而且djhurio你也说得对。在定义我的函数后,我添加了“vf <- Vectorize(f, SIMPLIFY = FALSE)”,然后outer正是我所需要的。 - Sam Swift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接