是否有一个函数运行多个变量的值的所有可能的组合?



抱歉,如果我错过了一个现有的功能,这样做,但努力寻找的东西。

基本上我有一个这样的例子(保持它的通用):

function <- (var1, var2)
values_for_var1 <- c("a", "b", "c")
values_for_var2 <- c(1:5)

我想知道的是,是否有一个快速的函数可以让我分别在列出的两个向量中"馈送"到var1var2,并为所有可能的配对运行这个?例如,将var1 == "a"替换为var2 == 1,然后替换为var2 == 2,然后替换为var2 == 3,依次替换为var1 == "b"var2 == c

可以做"长方式",但这并不能很好地缩放许多变量或所述变量的可能值。我认为purrr可能有一些东西,但除非我误读了指南,否则它没有。

谢谢。

1) expand.gridexpand.grid将在网格数据帧g中给出其参数的所有组合。然后我们可以对g的行进行操作。

注意expand.grid默认情况下会将字符输入转换为因子,除非stringsAsFactors = FALSE被指定为参数。

expand.grid的替代方案是merge,但它仅限于两个参数,而expand.grid可以使用任何数字。

# inputs
var1 <- letters[1:3]
var2 <- 1:5
f <- function(let, num) paste(10 * num, let)
# create grid
g <- expand.grid(var1, var2)
# operate on each row of grid
do.call(mapply, c("f", unname(as.list(g))))
# or
sapply(1:nrow(g), function(i) do.call("f", unname(g[i, ])))
# or
mapply(f, g[, 1], g[, 2])

对于具有相同参数数量的函数的2个以上向量也适用(或者可以在最后一个的情况下进行调整)。

2)外对于只有2个变量(就像我们这里一样),另一种方法是使用outer。这会产生一个长度(var1)乘长度(var2)矩阵。注意,outer只适用于向量化函数,所以通常这样写:

outer(var1, var2, Vectorize(f))

3)理解

在CRAN上有三个支持类python推导式的包,可能会修改语法。

3) eList

library(eList)
Chr(for(v1 in var1) for(v2 in var2) f(v1, v2))

如果结果是数字,则使用Num代替Chr;如果是复杂对象,则使用List。

3 b) listcompr

library(listcompr)
n1 <- length(var1); n2 <- length(var2)
gen.vector.char("{ f(var1[i], var2[j]) }", i = 1:n1, j = 1:n2)

如果结果是数字,请使用gen.vector而不是gen.vector.char,并且不要使用引号或大括号。

3 c) comprehenr

library(comprehenr)
to_vec(for (v1 in var1) for(v2 in var2) f(v1, v2))

4)其他有些包有扩展的选择。网格,然后我们可以使用该软件包的功能来申请本地复制它。

4 a) dplyr/tidyr

library(dplyr)
library(tidyr)
crossing(var1, var2) %>%
rowwise %>%
mutate(result = f(var1, var2)) %>%
ungroup

4 b) data.table

library(data.table)
outDT <- CJ(var1, var2)[, result := f(var1, var2), by = .I]

4 c) sqldf

library(sqldf)
var1df <- data.frame(var1); var2df <- data.frame(var2)
sqldf("select (10 * var2) || ' ' || var1 from var1df, var2df")

也许你可以像下面这样做expand.grid+Vectorize

with(
expand.grid(values_for_var1, values_for_var2),
Vectorize(func)(Var1, Var2)
)

相关内容

  • 没有找到相关文章

最新更新