Kon*_*lph 6 r vector cartesian-product
我有以下嵌套循环:
for (x in xs) {
for (y in ys) {
# Do something with x and y
}
}
Run Code Online (Sandbox Code Playgroud)
我想拉平,所以我想建立两个向量的笛卡尔乘积的xs和ys并遍历结果.在Python中,这将是微不足道的:
for xy in product(xs, ys):
# x, y = xy[0], xy[1]
Run Code Online (Sandbox Code Playgroud)
但在R中,我发现的最简单的等价物看起来令人生畏:
xys <- expand.grid(xs, ys)
for (i in 1 : nrow(xys)) {
xy <- as.vector(xys[i, ])
# x <- xy[1], y <- xy[2]
}
Run Code Online (Sandbox Code Playgroud)
当然必须有更好的方法,不是吗?(为了澄清,我不想迭代索引 ......我认为必须有一种方法可以直接迭代产品中的元组.)
mbq*_*mbq 10
R有一个与Python不同的范例,所以不要指望它有生成器或元组 - 我们有矢量和索引.
这样,只需调用就可以映射笛卡尔积上的函数
outer(xs,ys,function(x,y) ...)
Run Code Online (Sandbox Code Playgroud)
如果你愿意,可以将结果弄清楚.
编辑:如果xs或是ys比基本向量更复杂的东西,一个选项是使用索引,即
outer(seq(a=xs),seq(a=ys),function(xi,yi) ... xs[[xi]]/ys[xi,]/etc. ...)
Run Code Online (Sandbox Code Playgroud)
或使用在手工制作的产品上绘制功能 mapply
mapply(function(x,y) ...,xs,rep(ys,each=length(xs)))
Run Code Online (Sandbox Code Playgroud)
您可以使用该apply函数将函数应用于数据框的每一行.只需替换"your function"您的实际功能.
# example data
xs <- rnorm(10)
ys <- rnorm(10)
apply(expand.grid(xs, ys), 1, FUN = function(x) {"your function"})
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的例子.在这里,计算一行中两个值的总和:
apply(expand.grid(xs, ys), 1, FUN = function(x) {x[1] + x[2]})
Run Code Online (Sandbox Code Playgroud)
这是一个使用命名参数(xs,ys)而不是索引(x[1],x[2])的变体:
myfun <- function(xs, ys) xs + ys
arguments <- expand.grid(xs = rnorm(10), ys = rnorm(10))
apply(arguments, 1, function(x)do.call(myfun, as.list(x)))
Run Code Online (Sandbox Code Playgroud)