我正在尝试创建一个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])))
我想要的是一个data.frame,其中avgGPA值为3列,relGPA值为16行,单元格中的结果值为。
我为这是多么基本道歉,但我向你保证,我试图在没有你帮助的情况下实现这一目标。我已经尝试过关于sapply和mapply手册页上的示例,但是我只是对R来说有点太新了,看看我正在尝试做什么。
谢谢!
答案 0 :(得分: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)
长格式是格和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"
Edit2:(2013-01-05)一年后看到这个,我意识到SamSwift的功能可以通过使用“+”代替sum
来实现矢量化:
1/(1+exp( relGPA*pred.model$coef[1] + avgGPA*pred.model$coef[2]) # all vectorized fns