矢量有条件地增加向量值(条件重启运行总和) - 矢量化版本?

时间:2017-08-21 21:09:08

标签: r vectorization

给定二进制值out_2的向量,下面的代码返回一个向量 与out_2 out_1相同的长度。 out_1的条目计算在下一个符号切换之前out_2中剩余的连续相似项目的数量。如果你打印最后的cbind(),我想你会明白我的意思。

  library(zoo)
  n = 10
  out_2 = rep(NA, n)
  out_2[sample.int(n, 3)] = sample(c(-1, 1), 3, replace = TRUE)
  out_2 = zoo::na.locf(out_2)
  out_1 = out_2
  out_1[length(out_2)] = 1
  for(i in (length(out_2) - 1):1){
    out_1[i] = ifelse(out_2[i + 1] == out_2[i], out_1[i + 1] + 1, 1)  
  }
cbind(out_1, out_2)

我想知道是否有一种单线路矢量化方式从out_1获取out_2(即引导显式for循环)?

2 个答案:

答案 0 :(得分:3)

我会使用基座import csv with open('zinc3.csv') as f: reader = csv.DictReader(f) for row in reader: print row print ("#1\n") 中的rle。棘手的部分是获得R向量的相反顺序,所以它有(?)通过`lapply'

out_1

结果是:

out_1<- unlist(lapply(rle(out_2)$lengths, function(x) seq(x, by=-1)))

如果您对输出很灵活,并且不需要它以相反的顺序,那么您只需使用cbind(out_1, out_2) out_1 out_2 [1,] 2 -1 [2,] 1 -1 [3,] 1 1 [4,] 6 -1 [5,] 5 -1 [6,] 4 -1 [7,] 3 -1 [8,] 2 -1 [9,] 1 -1 功能。

sequence

答案 1 :(得分:1)

此解决方案迭代分组的连续值(不像示例中那样超过out_2)。基本上,我们对连续值进行分组,检查该组的大小,并创建向量N:1

foo <- rle(out_2)
cbind(unlist(sapply(foo$lengths, function(x) x:1)), 
      rep(foo$values, foo$lengths))