将向量的每个元素与R中的另一个向量组合

cdd*_*cdd 7 combinations r vector

我有两个向量

x <- c(2, 3, 4)
y <- rep(0, 5)
Run Code Online (Sandbox Code Playgroud)

我想获得以下输出:

> z
2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)

我怎么创造z?我试图使用paste,c但似乎没有任何工作.我唯一能想到的就是使用a for()而且速度非常慢.我用谷歌搜索了这个,我确信解决方案就在那里,我只是没有找到合适的关键词.

更新:用于基准测试目的:

使用Nicola的解决方案:

 > system.time(
+ precipitation <- `[<-`(numeric(length(x)*(length(y)+1)),seq(1,by=length(y)+1,length.out=length(x)),x)
+ )
user  system elapsed 
0.419   0.407   0.827 
Run Code Online (Sandbox Code Playgroud)

这太快了!我必须说!有人可以向我解释一下吗?我for()知道的我总是错的,R如果它完成了至少需要一天.

其他建议:

 > length(prate)
[1] 4914594
> length(empty)
[1] 207
> system.time(
+ precipitation <- unlist(sapply(prate, FUN = function(prate) c(prate,empty), simplify=FALSE))
+ )
user  system elapsed 
16.470   3.859  28.904 
Run Code Online (Sandbox Code Playgroud)

我不得不杀了

len <- length(prate)
precip2 <- c(rbind(prate, matrix(rep(empty, len), ncol = len)))
Run Code Online (Sandbox Code Playgroud)

15分钟后.

Mam*_*zal 5

你可以试试这个

unlist(sapply(x, FUN = function(x) c(x,y), simplify=FALSE))
 [1] 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

或更简单的来自@docendodiscimus

unlist(lapply(x, FUN = function(x) c(x,y)))
Run Code Online (Sandbox Code Playgroud)


nic*_*ola 5

出于某种原因,这似乎更快:

 unlist(t(matrix(c(as.list(x),rep(list(y),length(x))),ncol=2)))
Run Code Online (Sandbox Code Playgroud)

上述方案是通用的,在这两个感测xy可具有任何值.在OP情况下,其中y只有0,这很快,因为它可以是:

 `[<-`(numeric(length(x)*(length(y)+1)),seq(1,by=length(y)+1,length.out=length(x)),x)
 #[1] 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

编辑

我意识到我一直非常神秘,我制作的代码不容易理解,尽管只是一行.我将详细解释第二种解决方案的作用.

首先,您注意到生成的向量将具有包含的值x以及y重复length(x)次数中的零.所以总的来说,这将是length(x) + length(x)*length(y)length(x)*(length(y)+1)长.所以我们只要需要就创建一个只有零的向量:

  res<-numeric(length(x)*(length(y)+1))
Run Code Online (Sandbox Code Playgroud)

现在我们必须将x值放入res.我们注意到第一个值x占据了第一个值res; 第二个length(y)+1将从第一个开始,依此类推,直到所有length(x)值都被填满.我们可以创建一个索引向量来放置x值:

  indices<-seq.int(1,by=length(y)+1,length.out=length(x))
Run Code Online (Sandbox Code Playgroud)

然后我们进行替换:

  res[indices]<-x
Run Code Online (Sandbox Code Playgroud)

我的行只是上面三行的捷径.希望这澄清一点.