假设我有一个充满零的向量:
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.中是不受欢迎的。我怎样才能以矢量化的方式做到这一点,理想情况下没有外部包?
答案 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