使用唯一元素值向下或向上填充向量(如na.locf)

时间:2017-04-01 03:16:20

标签: r

我有一个大型数据框,每列包含集合{-1,1}中的一个标志,其余所有值都设置为零。我想用对应于该标志值的值填充或减少其余列条目。例如,给定一个代表1列的向量,我有

v <- rep(0,15) 
v[12] <- 1

#I'd want a function that is something like: 
f <- function(v,flag){ 
for(i in 2:length(v)){ if(v[i-1]==flag) v[i] <- flag else v[i]<-v[i]}
v
}

> v
 [1] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
> f(v,1)
 [1] 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

该示例适用于向前填充一些v和标志1.我还希望能够基于-1标志向后填充1。想到的显而易见的解决方案是na.locf,除了我不能让它在中间使用1并向前和向后填充。即使我用NA填充0个元素,它仍然不会根据标志部分填充或缩小。

是否有任何简单快速的矢量化函数可以使用填充了全零的矩阵或动物园对象来执行此操作,除非每列中有一个元素为1或-1,告诉它用1s填充或向上填充取决于价值?

编辑:考虑一下,我想出了一个可能的解决方案,一起插图,(希望如此)让我更清楚我想要什么。 此外,总体目标是按日期为基金指数创建加法/删除的掩码,填充加法(+1)并向后填补清除(-1)。另外,为什么我马上想到na.locf。但是仍然不确定这是否是这个块的最佳方法。任何想法都赞赏。

#generate random matrix of flags
v.mtx <- matrix(0,15,10)
for(i in 1:10){
v.mtx[sample(1:15,1),i] <- sample(c(-1,1),1)
}

fill.flag <- function(v) {
if(any(-1 %in% v)) {v[1:which(v!=0)] <- 1}
else
if(any(1 %in% v)) {v[which(v!=0):length(v)] <- 1}
v
}

> v.mtx
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    1    0    0    0     0
 [2,]    0    0    0    0    0    0    0    0    0     0
 [3,]    0    0    0    0    0    0    0    0    0     0
 [4,]    0    0    0    0    0    0    0    0    0     0
 [5,]    0    0    0    0    0    0    0    0    0     0
 [6,]    0    0    0    0    1    0   -1    0    0     0
 [7,]    0    0    0   -1    0    0    0    0    0     0
 [8,]    0    0    0    0    0    0    0    0    0     0
 [9,]    0    0    0    0    0    0    0    1    0    -1
[10,]    0    0    0    0    0    0    0    0   -1     0
[11,]    0    0    0    0    0    0    0    0    0     0
[12,]    0    0    0    0    0    0    0    0    0     0
[13,]    0    0    1    0    0    0    0    0    0     0
[14,]    0    0    0    0    0    0    0    0    0     0
[15,]    1   -1    0    0    0    0    0    0    0     0
> apply(v.mtx,2,fill.flag)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    1    0    1    0    1    1    0    1     1
 [2,]    0    1    0    1    0    1    1    0    1     1
 [3,]    0    1    0    1    0    1    1    0    1     1
 [4,]    0    1    0    1    0    1    1    0    1     1
 [5,]    0    1    0    1    0    1    1    0    1     1
 [6,]    0    1    0    1    1    1    1    0    1     1
 [7,]    0    1    0    1    1    1    0    0    1     1
 [8,]    0    1    0    0    1    1    0    0    1     1
 [9,]    0    1    0    0    1    1    0    1    1     1
[10,]    0    1    0    0    1    1    0    1    1     0
[11,]    0    1    0    0    1    1    0    1    0     0
[12,]    0    1    0    0    1    1    0    1    0     0
[13,]    0    1    1    0    1    1    0    1    0     0
[14,]    0    1    1    0    1    1    0    1    0     0
[15,]    1    1    1    0    1    1    0    1    0     0            

1 个答案:

答案 0 :(得分:1)

作为@G。格洛腾迪克评论说,你可以尝试cumminf1 <- function(x){ if(sum(x) == 1){ return(cummax(x)) }else{ return(rev(cummin(rev(x)))* -1) } } #apply as usual apply(v.mtx, 2, f1) ,即

...
from io import BytesIO
...
screenshot = driver.get_screenshot_as_base64()
img = Image.open(BytesIO(base64.b64decode(screenshot))
...