如果数据丢失的行多于2个,如何防止在值之间进行插值?

时间:2019-04-09 18:42:49

标签: r dplyr tidyverse

我想在mutate_at()中写一个条件语句,以使rox()不会在丢失数据多于2行的值之间插值。

以下是数据:

dat <- data.frame(
  time = 1:10, 
  var1 = c(10, 10, 10, 12, 12, 12, 15, 15, 15, 15), 
  var2 = c( 1, NA,  3,  6, NA, NA, NA, 10,  9,  8), 
  var3 = c(10, NA, NA, 13, 14, 16, NA, 18, 19, 20)
)

这是我要适应的代码块,以使它不会在值之间存在两个以上NA的情况下不进行插值(即,var2列中的第5-7行应保留NA,而应对所有其他NA进行插值)值。

library(tidyverse)

dat_int <- dat %>%
  mutate_at(vars(c(var2, var3)),
            funs(approx(time, ., time, rule = 1, method = "linear")[["y"]]))

1 个答案:

答案 0 :(得分:2)

步骤1:创建一个函数consecutiveNA,该函数可以基于阈值(由参数NA指定)在向量中标识连续的len

consecutiveNA <- function(x, len = 2){
  rl <- rle(is.na(x))
  logi <- rl$lengths >= len & rl$values
  rl$values <- logi
  inver <- inverse.rle(rl)
  return(inver)
}

步骤2:将approx函数应用于目标列(如您所做的那样)。

library(tidyverse)

dat_int <- dat %>%
  mutate_at(vars(c(var2, var3)),
            funs(approx(time, ., time, rule = 1, method = "linear")[["y"]]))

第3步:将consecutiveNA函数应用于dat中的所有列,并将结果转换为矩阵。

m_NA <- map(dat, consecutiveNA, len = 2) %>%
  as.data.frame() %>%
  as.matrix()

步骤4:基于m_NA,将TRUE中的NA替换为dat_int,然后完成工作。您可以将len更改为3或其他数字以查看其是否有效。

dat_int[m_NA] <- NA

dat_int
#    time var1 var2 var3
# 1     1   10    1   10
# 2     2   10    2   NA
# 3     3   10    3   NA
# 4     4   12    6   13
# 5     5   12   NA   14
# 6     6   12   NA   16
# 7     7   15   NA   17
# 8     8   15   10   18
# 9     9   15    9   19
# 10   10   15    8   20