2017-01-29 48 views
2

我試圖以編程方式將變量從0更改爲1如果在0之前和之後有三個1重新編碼基於周圍值的向量中的值

例如,如果在載體中的數量分別爲111011,並1,然後我想將0改變爲1

下面是數據的載體dummy_codedata.framedf

original_df <- data.frame(dummy_code = c(1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1)) 

這裏是我怎樣,我想有值重新編碼:

desired_df <- data.frame(dummy_code = c(1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1) 

我試圖用the function fill in the package tidyr,但是這填寫了缺失的值,所以它不起作用。如果我要將0值重新編碼爲缺失值,那麼這也不起作用,因爲它只會將每個NA編碼爲1,當時我只想編碼每個包含三個1sNA作爲1

有沒有辦法以編程的方式以有效的方式做到這一點?

+0

http://stackoverflow.com/questions的可能的複製/ 23840590/how-to-the-the-succeeded-numbers-every-there-is-a-0-in-r – akrun

回答

3

一種rle替代方案中,使用從@G的x。格羅騰迪克的回答是:

r <- rle(x) 

的奔跑查找索引3 1

i1 <- which(r$lengths == 3 & r$values == 1) 

檢查其中的「1指標」圍繞一個0,並得到了0的指標進行更換:

i2 <- i1[which(diff(i1) == 2)] + 1 

替換相關01

r$values[i2] <- 1 

反向更新的運行的rle操作:

inverse.rle(r) 
# [1] 1 0 0 1 1 1 1 1 1 1 0 0 1 

基於data.table::rleid類似的解決方案,更爲簡潔,也許更容易閱讀:

library(data.table) 
d <- data.table(x) 

計算每次運行的長度:

d[ , n := .N, by = rleid(x)] 

對於「X」,這是零和前述和隨後的運行1是長度3,設置「x」的給1

d[x == 0 & shift(n) == 3 & shift(n, type = "lead") == 3, x := 1] 
d$x 
# [1] 1 0 0 1 1 1 1 1 1 1 0 0 1 
+0

不好意思在中途改變遊戲,但是可以修改'3'或更大的遊程? –

+1

是的,我假設你只需要將'== 3'改成你需要的任何條件,例如'> = 3'。嘗試! ;) – Henrik

+0

對於'data.table'的例子,這個工作:'d [dummy_code == 0&shift(n)> = 3&shift(n,type =「lead」)> = 3,dummy_code:= 1] $ dummy_code'。想知道是否需要改變另一個值(即':= 1'),但現在看到的是重新編碼的內容。 –

3

下面是使用從rollapply動物園一個班輪:

library(zoo) 

rollapply(c(0, 0, 0, x, 0, 0, 0), 7, function(x) if (all(x[-4] == 1)) 1 else x[4]) 
## [1] 1 0 0 1 1 1 1 1 1 1 0 0 1 

注意:用於輸入是:

x <- c(1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1) 
+0

c中的'x'(0,0,0,x,0,0 ,0)'指的是輸入?如果是這樣,我們可以改變以消除歧義?謝謝 –

+0

答案確實如此:「使用的輸入是:'x <-'」 –

+0

是的,但是在lambda函數中也有一個'x',但不能少混淆?再次感謝 –