如何基于来自其他向量的开始和停止索引来处理向量中的值?

时间:2015-08-28 21:41:53

标签: r vector indexing

假设我有一个充满零的向量:

starts <- seq(10, 90, 10)
stops <- starts + round(runif(length(starts), 1, 5))

我想将某些范围内的值设置为1:

for(i in seq_along(starts)) x[starts[i]:stops[i]] <- 1

我可以使用for循环执行此操作:

protected void moveBall() {
        for (Node node:this.getChildren()) {
            Ball ball = (Ball)node;

但是我知道这在R.中是不受欢迎的。我怎样才能以矢量化的方式做到这一点,理想情况下没有外部包?

3 个答案:

答案 0 :(得分:3)

您可以使用Map()来获取所有索引Reduce(union, ...),将该列表放到唯一索引的原子向量中然后[<-replace()替换。

replace(x, Reduce(union, Map(":", starts, stops)), 1L)

x[Reduce(union, Map(":", starts, stops))] <- 1L

此外,for()循环不一定是“不受欢迎的”#34;在R.这取决于具体情况。很多时候for()循环变成最有效的路径。

答案 1 :(得分:1)

使用apply的解决方案:

x[unlist(apply(cbind(starts, stops), 1, function(x) x[[1]]:x[[2]]))] <- 1

答案 2 :(得分:0)

starts <- seq(10, 90, 1)
change_index <- starts[starts %% 10 <= 5]

x[change_index] <- 1