2017-04-01 62 views
0

我有一個很大的數據框,每列包含一組{-1,1}中的一個標記,所有其餘的值都設置爲零。我想用與該標誌值相對應的值填充或放下其餘的列條目。例如,給定一個向量來代表一米欄,我有使用獨特的元素值填充矢量(如na.locf)

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

如果輸入是在接下來的問題'cummax(x)的所有零和一的向量'會從第一個1取代一切起1。那是你要的嗎? –

+0

增加了更多信息來澄清。 – pat

回答

1

作爲@G。格羅騰迪克評論,你可以嘗試cummaxcummin,即

f1 <- function(x){ 
    if(sum(x) == 1){ 
    return(cummax(x)) 
    }else{ 
    return(rev(cummin(rev(x)))* -1) 
    } 
} 

#apply as usual 
apply(v.mtx, 2, f1)