等效于'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