2015-11-24 192 views
2

我的動物園(時間序列)數據集看起來像下面並有數百行的:如何根據多個條件值之間的替換NA值

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
NA NA NA NA 1 1 1 NA NA NA 3 3 3 NA NA 1 1 

cycle4I <- zoo(c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1)) 

這個變量是一個較大的動物園數據集的一部分。這個變量的一般模式是一系列的1,然後是NAs,然後是3,然後是NAs,並且從一系列1開始重複該模式。 NA的數量沒有規律。 (i)在1和3之間用2填滿新生,(ii)在3和1之間用4填充新生,以及(iii)在前四次觀察中填入新生4遵循一般模式。完成後,這些值將是一系列1,2,3和4,而沒有四個值中的每一個的數量模式。

我花了數小時試圖ifelsefor循環沒有成功。 (相對新手與這部分R.)

我以前在Stata做過這個任務,但無法找出R中的代碼來填充NA。該Stata的代碼來填充的NAS:

replace cycle4I = 2 if missing(cycle4I) & (cycle4I[_n-1] == 1 | cycle4I[_n-1] == 2) & (cycle4I[_n+1] == . | cycle4I[_n+1] == 3) 

replace cycle4I = 4 if missing(cycle4I) & (cycle4I[_n-1] == 3 | cycle4I[_n-1] == 4) & (cycle4I[_n+1] == . | cycle4I[_n+1] == 1) 

回答

0

下面是一個簡單的方法:

library(zoo) 
cycle4I <- zoo(c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1)) 

x <- cycle4I 

x[1] <- 3 
x <- is.na(x) + na.locf(x) 
x[1] <- 4 

其中給出:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
4 4 4 4 1 1 1 2 2 2 3 3 3 4 4 1 1 
+0

非常優雅。從中學習。沒有意識到邏輯TRUE的數值爲1:TRUE == 1產生TRUE。 – mac

0

這裏有一種方法

library(dplyr) 
library(zoo) 

data_frame(cycle4I = c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1)) %>% 
    mutate(final = 
      cycle4I %>% 
      lag %>% 
      na.locf(na.rm = FALSE) %>% 
      `+`(1) %>% 
      ifelse(is.na(cycle4I), 
        ., cycle4I)) 
+0

許多感謝@ bramtayl。我需要將我的大型數據集保存爲動物園時間序列功能的動物園類。我認爲這個data_frame函數將這個數據作爲data.frame類,儘管我想我們可以將上述向量綁定到其他動物園數據中。 – mac

相關問題