【问题标题】:Sequences of varying length in RR中不同长度的序列
【发布时间】:2016-04-22 15:54:48
【问题描述】:

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

我有一个向量,例如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)吗?

【问题讨论】:

  • x &lt;- sequence(a) - 1; x; as.integer(c(diff(x) != 1, TRUE)) 是一种可能性。
  • 第二个向量你也可以x &lt;- integer(sum(a)) ; x[cumsum(a)] &lt;- 1L
  • 第一个,另一个选项是g1 &lt;- rep(seq_along(a), a); ve(seq_along(g1), g1, FUN= seq_along)-1
  • tabulate(cumsum(a)) 值得另外评论
  • 感谢大家的快速回复。我对 R 比较陌生,但不知道 'sequence(a) - 1' 感觉很尴尬。

标签: r loops rep


【解决方案1】:

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

## 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,因此请随时编辑和添加替代方案。

【讨论】:

  • 对于第二个向量,这有效:sequence(a) %/% rep(a, a)
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2013-08-02
  • 2010-12-24
  • 2018-12-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
相关资源
最近更新 更多