2016-12-30 72 views
4

我有R中的向量包含大量的0和一些非零數字。每個向量都以非零數字開頭。如何填寫向量中的值?

例如< 1,0,0,0,0,0,2,0,0,0,0,0,4,0,0,0>

我想設置所有的零等於最近的非零數字。

I.e.這個載體將變成< 1,1,1,1,1,1,2,2,2,2,2,2,4,4,4,4>

我需要這樣做約100每個媒體包含約600萬條記錄。目前我正在使用for循環:

for(k in 1:length(vector){ 

    if(vector[k] == 0){ 

    vector[k] <- vector[k-1] 
    } 
} 

有沒有更有效的方法來做到這一點?

謝謝!

+0

是向量順序除零之外?如果是這樣,我認爲你應該可以使用'cummax'。即:'矢量< - cummax(矢量)' – rosscova

+0

我認爲主要是前者,但真的只是提高它作爲一個好點。我沒有專門投票,但我確實認爲這是一個很好的建議。 – rosscova

+1

如果您將鼠標懸停在upvote箭頭上,則表示「此評論添加了對帖子有用的內容」。我認爲這正是它的意思。也許不是完整的答案,但增加了一些有用的東西。 – G5W

回答

7

一種選擇,將是那些0NA代替,然後使用zoo::na.locf

x <- c(1,0,0,0,0,0,2,0,0,0,0,0,4,0,0,0) 
x[x == 0] <- NA 
zoo::na.locf(x) ## you possibly need: `install.packages("zoo")` 
# [1] 1 1 1 1 1 1 2 2 2 2 2 2 4 4 4 4 

感謝Richard爲我展示瞭如何使用replace

zoo::na.locf(replace(x, x == 0, NA)) 
4

你可以試試這個:

k <- c(1,0,0,0,0,0,2,0,0,0,0,0,4,0,0,0) 
k[which(k != 0)[cumsum(k != 0)]] 

或其他情況下cummax不宜

k <- c(1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0) 
k[which(k != 0)[cumsum(k != 0)]] 

邏輯:

  • 我保持了指數的 「軌跡」的非零的矢量元素which(k != 0),讓我們表示這個新的矢量as xx=c(1, 7, 13)

  • 接下來我要「抽樣」這個新的向量。怎麼樣?從k我創建遞增每次有非零元素cumsum(k != 0)時間一個新的載體,讓來自矢量x表示這個新的向量作爲yy=c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3)

  • 我「採樣」:x[y]即服用x第一要素6次,然後第二個元素6次,第三個元素3次。讓表示這個新的向量作爲zz=c(1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 13, 13, 13)

  • 我從矢量kk[z]「採樣」,即我正在採取的第一個元素的6倍,然後在第七元件6次,然後在13元件3次。

+1

這真的很聰明,但功能有點不透明,至少對我來說(我必須把它分開,並且一次運行一步就搞清楚了)。我認爲如果你能夠簡單地解釋發生了什麼,那將會很棒。 – rosscova

1

加到@李哲源的回答:

如果需要更換與最近的非NA值領先NAS和更換其他NAS與最後一個非NA值,該代碼可以是:

x <- c(0,0,1,0,0,0,0,0,2,0,0,0,0,0,4,0,0,0) 
zoo::na.locf(zoo::na.locf(replace(x, x == 0, NA),na.rm=FALSE),fromLast=TRUE) 
# you possibly need: `install.packages("zoo")` 
# [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2 4 4 4 4