【问题标题】:apply function using expand.grid in R在 R 中使用 expand.grid 应用函数
【发布时间】:2014-08-24 21:34:13
【问题描述】:

我有两个向量 xy。我使用以下函数创建了一个网格:

v = expand.grid(x, y)

我有一个函数定义如下

N <- function(a, b , dat){
     m = ncol(Filter(function(z) a*max(z)*min(z) < b , dat[1:ncol(dat)]))
     return(m)
}

然后我需要在x,y 的网格上最大化N

Maximize <- function(x , y ,dat){
          v = as.matrix(expand.grid(x,y))
          # Here is where I want to map the values of v and get the maximum element and 
          # get the tuple in v that maximized N
          temp1 <- max(apply(v , 1 , N(v[[1]] , v[[2]] , dat)))
}

谢谢

【问题讨论】:

  • 你不能只做v$x + v$y吗? (将v 认为不是二维元组的集合而是两个平行向量可能会有所帮助)
  • 嗨@DavidRobinson,我打算将这个概念用于地图内部更复杂的功能。
  • 我正在对网格进行一些优化,所以我需要传递一个函数,该函数从两个元素的笛卡尔积中获取元素。
  • 所以我想将网格中的整个值传递给一个函数,其中函数迭代地应用于列表中的每个元素,然后我可以取最小值。
  • 您可能希望在原始问题中提供更多上下文。

标签: r map


【解决方案1】:

Map 不会像那样遍历列表的行。怎么样

x <- 1:3
y <- 11:13
v <- expand.grid(x, y)
do.call(mapply, c(function(a, b) a+b, unname(v)))
# [1] 12 13 14 13 14 15 14 15 16

这里每个值都作为单独的参数传递给函数。

【讨论】:

    【解决方案2】:

    您可以为此使用apply

    apply(v, 1, myfunction)
    

    myfunction 是您的函数(您已在 cmets 中阐明它比加法更复杂)。 1 表示您要应用于行(2 表示应用于列)。

    如果xy 都是数字(或都是字符向量)*,您当然想先将v 转换为矩阵:

    apply(as.matrix(v), 1, myfunction)
    

    这会更高效,并使传递给myfunction 的值成为向量而不是单行数据框。

    然而,如果myfunction 的内容是某种数值运算,则很有可能您可以将其向量化。


    *如果xy 都是字符向量,请不要忘记在expand.grid 调用中使用stringsAsFactors=FALSE

    【讨论】:

    • 谢谢。如何使用行的元素作为参数?应该做函数(x)x[1] + x[2]?
    • 我猜一个更好的提问方式是如何访问函数中行的元素?
    • @kolonel:是的,如果您按照我的建议先使用as.matrix。如果您将其直接应用于数据框,则它将改为x[[1]] + x[[2]]
    • 谢谢。访问元素的方式似乎有点违反直觉,不是吗?
    • @kolonel 我不确定我会说这是反直觉的。同样,我认为更直观(并且可能更有效)的方法是将您的操作矢量化。如果您分享功能的详细信息,我可以提供帮助。
    猜你喜欢
    • 2012-08-21
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多