等效于'outer',具有列表或向量输出
使用等效于'outer',具有列表或向量输出,r,vectorization,R,Vectorization,使用map可以对每对参数应用一个函数: > mapply(rep, 1:4, 4:1) [[1]] [1] 1 1 1 1 [[2]] [1] 2 2 2 [[3]] [1] 3 3 [[4]] [1] 4 我希望做一些类似的事情,但是对于带有outer的参数的每个组合,它都不起作用,因为在本例中outer的输出应该是4x4数组: > outer(1:4, 4:1, rep) Error in dim(robj) <- c(dX, dY) : dims [prod
map
可以对每对参数应用一个函数:
> mapply(rep, 1:4, 4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
我希望做一些类似的事情,但是对于带有outer
的参数的每个组合,它都不起作用,因为在本例中outer
的输出应该是4x4数组:
> outer(1:4, 4:1, rep)
Error in dim(robj) <- c(dX, dY) :
dims [produit 16] ne correspond pas à la longueur de l'objet [40]
我可以结合使用expand.grid
和apply
,但我希望有更简单的解决方案:
> unlist(apply(expand.grid(1:4, 4:1), 1, function(x) rep(x[1], x[2])))
Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 1 1
Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1 Var1
1 2 2 2 3 3 3 4 4 4 1 1 2 2 3 3 4 4
Var1 Var1 Var1 Var1
1 2 3 4
基于李哲源 李哲远的回复(记录在案):使用
outer
和Vectorize
可以获得一个不寻常的对象:一个矩阵,每个元素都是一个列表:
> res <- outer(1:4, 4:1, Vectorize(rep.int))
> class(res)
[1] "matrix"
> typeof(res)
[1] "list"
> res
[,1] [,2] [,3] [,4]
[1,] Integer,4 Integer,3 Integer,2 1
[2,] Integer,4 Integer,3 Integer,2 2
[3,] Integer,4 Integer,3 Integer,2 3
[4,] Integer,4 Integer,3 Integer,2 4
在这种情况下,outer(1:4,4:1,Vectorize(rep.int))
起作用,但在许多情况下,您需要outer(1:4,4:1,Vectorize(rep.int,SIMPLIFY=TRUE))
。
有关更多解释,请参阅
这里,myfun的输出是一个长度为2的向量-->仅适用于SIMPLIFY=FALSE
,因为您需要每次运行myfun
的结果是一个长度为1的列表
> myfun <- function(x, y) c(sum(x,y), mean(x,y))
> myfun(1,4)
[1] 5 1
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = TRUE))
Error in dim(robj) <- c(dX, dY) :
dims [produit 16] ne correspond pas à la longueur de l'objet [32]
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = FALSE))
>
这里myfun的输出是一个长度为1的列表,其中包含一个长度为2的向量
-->与SIMPLIFY=FALSE
和SIMPLIFY=TRUE
> myfun <- function(x, y) return(list(c(sum(x,y),mean(x,y))))
> myfun(1,4)
[[1]]
[1] 5 1
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = TRUE))
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = FALSE))
>myfun myfun(1,4)
[[1]]
[1] 5 1
>res-res只需使用FUN=Vectorize(rep.int,SIMPLIFY=FALSE)
内部外部
,即可获得矩阵列表
相关:只需使用FUN=Vectorize(rep.int,SIMPLIFY=FALSE)
内部外部
,即可获得矩阵列表
相关:如果我们需要一个带有Map
unlist(do.call(Map, c(f= rep, unname(expand.grid(1:4, 4:1)))))
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 2 2 3 3 4 4 1 2 3 4
如果我们需要一个带有Map
unlist(do.call(Map, c(f= rep, unname(expand.grid(1:4, 4:1)))))
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 2 2 3 3 4 4 1 2 3 4
那么取消列表(sapply(4:1,函数(t)rep(1:4,每个=t))呢?
?很抱歉,我意外地无法使用。。。这两个答案似乎都不错,但你的答案更直截了当……关于未列出(sapply(4:1,function(t)rep(1:4,each=t))
?很抱歉,我意外地不可用。。。两个答案似乎都不错,但你的答案更直截了当……我以前从未见过列表矩阵!我甚至不知道这是可能的。真有教育意义!谢谢我只是不知道你为什么需要SIMPLYFY=FALSE
好的,现在我想我理解了我想的SIMPLIFY=FALSE
部分。我必须阅读几遍提供的链接,并做自己的例子来理解它。再次感谢。我以前从未见过列表矩阵!我甚至不知道这是可能的。真有教育意义!谢谢我只是不知道你为什么需要SIMPLYFY=FALSE
好的,现在我想我理解了我想的SIMPLIFY=FALSE
部分。我必须阅读几遍提供的链接,并做自己的例子来理解它。再次感谢。
> myfun <- function(x, y) return(list(c(sum(x,y),mean(x,y))))
> myfun(1,4)
[[1]]
[1] 5 1
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = TRUE))
> res <- outer(1:4, 4:1, Vectorize(myfun, SIMPLIFY = FALSE))
unlist(do.call(Map, c(f= rep, unname(expand.grid(1:4, 4:1)))))
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 2 2 3 3 4 4 1 2 3 4