如何根据多个条件替换值之间的NA值

时间:2015-11-24 23:42:51

标签: r conditional zoo

我的动物园(时间序列)数据集如下所示,并持续数百行:

ifelse

此变量是较大动物园数据集的一部分。这个变量的一般模式是一系列的1,然后是N,然后是3,然后是NAs,并从一系列的1开始再次重复该模式。没有常规的NA数量模式。

我试图(i)用2填充1和3之间的NAs,(ii)用4填充3和随后1的NAs,以及(iii)在前4个观察中用4填充NA遵循一般模式。完成后,这些值将是一系列1,2,3和4,而不包含四个值中每个值的数量模式。

我花了好几个小时尝试forreplace 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) 循环但没有成功。 (这部分R的相对新手。)

我以前在Stata中完成了这个任务,但是无法弄清楚R中的代码来填充NA。填写NA的Stata代码是:

require.config({
    baseUrl: "script/module",
    paths: {
        "signals": "vendor/signals"
    }
});

require(["mainController"], function(){
    console.log("Full dependency tree load complete");
});

2 个答案:

答案 0 :(得分: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) )

答案 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