【问题标题】:mapply basics? - how to create a matrix from two vectors and a function映射基础? - 如何从两个向量和一个函数创建一个矩阵
【发布时间】:2011-03-25 22:06:05
【问题描述】:

我正在尝试创建一个用于创建图表的 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,其中 3 列用于 avgGPA 值,16 行用于 relGPA 值以及单元格中的结果值。

我很抱歉这是多么基本,但我向你保证,我已经尝试在没有你帮助的情况下实现这一点。我已经尝试按照 sapply 和 mapply 手册页上的示例进行操作,但我对 R 有点太陌生,无法看到我想要做什么。

谢谢!

【问题讨论】:

    标签: r matrix mapply


    【解决方案1】:

    无法使用提供的信息进行测试,但这应该可以:

    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()”-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
    

    【讨论】:

    • f 必须是矢量化函数才能在outer 中使用它。而apply 不能那样工作。查看我的编辑。
    • 感谢 DWin,它成功了,而且 djhurio 你也做得对。我在定义函数后添加了“vf
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2021-11-16
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2015-01-30
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多