R中不同长度的序列
Sequences of varying length in R
我的问题很简单,但我仍然无法在网上找到解决方案。
我有一个向量,例如a = c(7,3,5)
。我需要将其转换为 b = c(0,1,2,3,4,5,6,0,1,2,0,1,2,3,4)
。我可以用一个循环来做到这一点,但是当 length(a) > 500000.
m <- 0
n <- 0
for (i in 1:length(a)) {
m <- n+1;
n <- n+a[i];
b[m:n] <- (0:(a[i]-1));
}
R 中是否有一种单行代码可以非常快速地产生所描述的行为?同样的方法能否将向量 a 转换为 c = c(0,0,0,0,0,0,1,0,0,1,0,0,0,0,1)
?
评论中有多个选项,但答案区域中没有一个选项,因此在寻找 可能 重复项的同时,这里是对我们目前所拥有内容的整合.每个选项最 direct/logical 的备选方案列在最前面。
## To get your first vector
sequence(a) - 1 # @Henrik
ave(1:sum(a), rep(seq_along(a), a), FUN = seq_along) - 1 # @akrun
## To get your second vector
tabulate(cumsum(a)) # @alexis_laz
{ x <- integer(sum(a)) ; x[cumsum(a)] <- 1; x } # @DavidArenburg
{ x <- sequence(a) - 1 ; as.integer(c(diff(x) != 1, TRUE)) } # @Henrik
sequence(a) %/% rep(a, a) # @GL_Li
此答案是社区维基百科,因此请随时编辑和添加替代方案。
我的问题很简单,但我仍然无法在网上找到解决方案。
我有一个向量,例如a = c(7,3,5)
。我需要将其转换为 b = c(0,1,2,3,4,5,6,0,1,2,0,1,2,3,4)
。我可以用一个循环来做到这一点,但是当 length(a) > 500000.
m <- 0
n <- 0
for (i in 1:length(a)) {
m <- n+1;
n <- n+a[i];
b[m:n] <- (0:(a[i]-1));
}
R 中是否有一种单行代码可以非常快速地产生所描述的行为?同样的方法能否将向量 a 转换为 c = c(0,0,0,0,0,0,1,0,0,1,0,0,0,0,1)
?
评论中有多个选项,但答案区域中没有一个选项,因此在寻找 可能 重复项的同时,这里是对我们目前所拥有内容的整合.每个选项最 direct/logical 的备选方案列在最前面。
## To get your first vector
sequence(a) - 1 # @Henrik
ave(1:sum(a), rep(seq_along(a), a), FUN = seq_along) - 1 # @akrun
## To get your second vector
tabulate(cumsum(a)) # @alexis_laz
{ x <- integer(sum(a)) ; x[cumsum(a)] <- 1; x } # @DavidArenburg
{ x <- sequence(a) - 1 ; as.integer(c(diff(x) != 1, TRUE)) } # @Henrik
sequence(a) %/% rep(a, a) # @GL_Li
此答案是社区维基百科,因此请随时编辑和添加替代方案。