向outer()传递参数

4
set.seed(8)
data <- 
  data.frame(A=rnorm(10),
             B=rnorm(10))



fun <- function(df,x,y){
  require(dplyr)
  res <- 
    filter(df,A<x,B>y) %>%
    nrow()
  return(res)
}

这适用于 x 和 y 的单个值:

fun(x=1,y=0,df=data)

我想使用outer()(或类似函数)对x和y进行组合,但无法弄清如何传递df参数。这似乎与此处的问题相同: Using outer() with a multivariable function。 但是通过...传递df并不起作用:

outer(x=c(0,2),y=c(0,2),fun,df=data)

什么是缺失?

fun 的前两个参数必须是你的 xy并且如果你想使用 outer,它必须针对这些参数进行向量化。 - Roland
@Roland:您能详细解释一下“必须矢量化”的含义吗? - user3375672
1
向量化(yourFunction....,vec=c("x", "y")) - Rorschach
@Legalizelt:我不明白,抱歉。 - user3375672
3个回答

5

我建议使用cut函数:

# borrowing the @Colonel's example:
x = c(0,1,2)
y = c(-1,0,2)

library(magrittr)
data %<>% mutate(
  Ag = cut(A,c(-Inf,x,Inf)), 
  Bg = cut(B,c(-Inf,y,Inf))
)

with(data, table(Ag,Bg))
#           Bg
# Ag         (-Inf,-1] (-1,0] (0,2] (2, Inf]
#   (-Inf,0]         1      4     3        0
#   (0,1]            0      0     2        0
#   (1,2]            0      0     0        0
#   (2, Inf]         0      0     0        0

这可能不符合OP所需的不等式,但我认为一些变化会起作用。请注意,xy必须按顺序排序才能使用cut


3
您可以使用Currymapply
library(functional)

df = expand.grid(c(1,2,0),c(-1,2,0))

mapply(Curry(fun, df=data), df[,1],df[,2])
#[1] 9 9 7 0 0 0 5 5 3

mapply不是我想要的:我需要x和y的所有组合,即一个3x3矩阵(9个结果)。 - user3375672
2
在这种情况下,只需为mapply提供正确的参数即可 ;) - Colonel Beauvel
有人吗?似乎要关闭了! - user3375672
也许你想把结果放在一个矩阵中(就像 outer 一样)? - Frank
是的!但我认为如果像@LegalizeIt的答案中所述正确地放置,外部会做到这一点。 - user3375672

3

向量化参数意味着您的函数可以接受矢量作为参数。正如@Roland在评论中所述,您的函数需要特别设置才能与outer一起使用。因此,前两个参数应该是向量化的。这意味着您可以传递xy参数的向量,并且函数将在这两个值的每个值上被调用。您可以使用Vectorize函数轻松完成此操作。

fun <- Vectorize(function(x, y, df){
  require(dplyr)
  res <- 
    filter(df,A<x,B>y) %>%
    nrow()
  return(res)
}, vectorize.args=c("x", "y"))


outer(c(0,1,2), c(-1,0,2), fun, df=data)

#      [,1] [,2] [,3]
# [1,]    7    3    0
# [2,]    9    5    0
# [3,]    9    5    0

1
并且为了在结果中获得dimnames:outer(setNames(x,x), setNames(y,y), fun, df=data) - Frank
很好,vec是Vectorize的vectorize.args参数吗? - user3375672
2
@user3375672 是的,R函数将使用部分匹配来匹配参数。 - Rorschach

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