给定二进制值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循环)?
答案 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))