我想在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"]]))
答案 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