2015-11-24 193 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

相关问题