我有一个宽度矢量,
ws = c(1,1,2,1,3,1)
Run Code Online (Sandbox Code Playgroud)
从这个向量我想有另一个这种形式的向量:
indexes = c(1,2,3,5,6,7,9,11,12)
Run Code Online (Sandbox Code Playgroud)
为了创建这样的向量,我在R中做了以下循环:
ws = c(1,1,2,1,3,1)
indexes = rep(0, sum(ws))
counter = 1
counter2 = 1
last = 0
for(i in 1:length(ws))
{
if (ws[i] == 1)
{
indexes[counter] = counter2
counter = counter + 1
} else {
for(j in 1:ws[i])
{
indexes[counter] = counter2
counter = counter + 1
counter2 = counter2+2
}
counter2 = counter2 - 2
}
counter2 = counter2+1
}
Run Code Online (Sandbox Code Playgroud)
逻辑如下,ws中的每个元素指定索引中相应的元素数.例如,如果ws为1,则索引中元素的相应数量为1,但如果ws> 1,则假设为3,index中元素的相应数量为3,并且元素将被逐个跳过,对应3,5,7.
但是,我想避免for循环,因为它们在R中往往很慢.你对如何仅通过向量运算实现这样的结果有任何建议吗?还是一些更奇特的解决方案?
谢谢!
这是一个矢量化的单行为您:
ws <- c(1,1,2,1,3,1)
cumsum((unlist(sapply(ws, seq_len)) > 1) + 1)
# [1] 1 2 3 5 6 7 9 11 12
Run Code Online (Sandbox Code Playgroud)
你可以一块一块地拆开它,从里到外工作,看看它是如何工作的.
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |