2

我的问题很简单,但我仍然无法在网上找到解决方案。

我有一个向量,例如a = c(7,3,5). 我需要将其转换为b = c(0,1,2,3,4,5,6,0,1,2,0,1,2,3,4). 我可以通过循环来做到这一点,但是当长度(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)吗?

4

1 回答 1

4

评论中有几个选项,但没有一个发布在答案区域中,因此在寻找可能的重复项的同时,这里是我们迄今为止所拥有的内容的合并。首先列出每个选项的最直接/合乎逻辑的替代方案。

## 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

此答案是社区 Wikied,因此请随时编辑和添加替代方案。

于 2016-01-17T13:32:44.060 回答