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