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分钟后.
你可以试试这个
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)
出于某种原因,这似乎更快:
unlist(t(matrix(c(as.list(x),rep(list(y),length(x))),ncol=2)))
Run Code Online (Sandbox Code Playgroud)
上述方案是通用的,在这两个感测x和y可具有任何值.在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)
我的行只是上面三行的捷径.希望这澄清一点.