2011-03-25 48 views
6

我想创建一个data.frame从中创建一个图形。我有一个函数和两个向量,我想用作两个输入。这是一个有点简单,但基本上所有我拥有的是:mapply基础知识? - 如何创建一个矩阵从两个向量和一个函数

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值与在所得到的值data.frame细胞。

我很抱歉,这是多么基本,但我向你保证,我试图在没有你的帮助下做到这一点。我已经尝试过在sapply和mapply手册页上的例子,但是我只是对R来说有些太新,不知道我想要做什么。

谢谢!

回答

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指出和(解决)由萨姆斯威夫特与Vectorize策略。在apply的情况下,sum函数可以像上面描述的那样工作,但除法运算符不会,因此这里是另一个可以推广到具有多个参数的更复杂函数的例子。所有程序员的需求是合适的参数列在“申请()”,数字 - 编辑”功能,因为(不幸)列名没有得到贯彻到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年1月5日),在此展望一年后,我意识到,SamSwift的职能,可以使得它的身体用“+”代替sum进行矢量化:

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

'F'必须是一个矢量功能在'outer'中使用它,然后'apply'不起作用,请参阅我的编辑。 – djhurio 2011-03-26 13:02:37

+1

谢谢迪文,这个技巧,djhurio,你说得对好。我在定义我的函数后添加了“vf < - Vectorize(f,SIMPLIFY = FALSE)”,然后outer就是我所需要的。 – 2011-03-26 15:11:02

相关问题