R用上次结转结转间歇性NA值(NA.LOCF)

时间:2018-07-23 19:33:18

标签: r dplyr zoo

背景

我需要根据NA的性质使用不同的方法替换数据框中的NA。我的数据框架来自一项重复测量的研究,其中一些Na是受试者遗失的结果,而其他Na是间歇性缺失测量(定义为一个或多个缺失测量的序列,然后是测量值)的结果。 我将间歇性缺失测量称为间歇性NA。

问题

我无法测试NA是否是间歇性丢失测量结果的结果,以及应使用哪些功能替换这些NA。理想情况下,我将这些间歇性NA替换为na.locf方法。但是我需要用基准线或观察到的最后一个值(以较大者为准)替换Dropout NA's。

示例

示例1

这是NA的一个干净的例子,我想将其作为使用na.locf插补的间歇性NA:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,NA,NA,15,16,19,NA,12,23,31))

以及我希望最终结果如何:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,34,34,15,16,19,19,12,23,31))

示例2

以下是我想通过先前的非NA观察值或基线值(访问1)估算的NA(缺失NA)的清晰示例:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,22,18,15,16,19,NA,NA,NA,NA))

以及我希望最终结果如何:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,22,18,15,16,19,34,34,34,34))

示例3

这是需要不同归因的NA混合的一个复杂示例,在这里,先前的非NA观察值大于掉落NA的基线观察值(访问1):

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,NA,NA,42,16,19,NA,38,NA,NA))

我希望结果如何:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(34,34,34,42,16,19,19,38,38,38))

示例4

另一个复杂的示例,其中基线观察值(访问1)大于先前的非NA值,用于丢弃NA:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(40,NA,NA,42,16,19,NA,38,NA,NA))

我希望结果如何:

data.frame(visit=c(1,2,3,4,5,6,7,8,9,10),value=c(40,40,40,42,16,19,19,38,40,40))

我尝试过的事情

如@Gregor所建议,在我声明这将解决我的问题后,可以用以下方法测试是否存在间歇性NA:

mutate(is.na(value) & !is.na(lead(value))

但这不能帮助我估算序列(NA1,NA2,NA3,14)中的所有间歇性NA,特别是在运行此测试后仅将NA3返回为TRUE的情况。

1 个答案:

答案 0 :(得分:0)

我们可以使用na.locf(..., fromLast = TRUE)来标识尾随的NA值,并在基线上使用pmax。我们将以一种很好的综合格式来演示您问题中的示例:

# consolidate example data
dd = data.frame(
  example = rep(1:3, each = 10),
  visit = rep(1:10, 3),
  value = c(34,NA,NA,15,16,19,NA,12,23,31,
            34,22,18,15,16,19,NA,NA,NA,NA,
            34,NA,NA,42,16,19,NA,38,NA,NA),
  goal = c(34,34,34,15,16,19,19,12,23,31,
           34,22,18,15,16,19,34,34,34,34,
           34,34,34,42,16,19,19,38,38,38)
)

library(dplyr)
dd = dd %>% group_by(example) %>%
  mutate(to_fill = !is.na(zoo::na.locf(value, fromLast = TRUE, na.rm = FALSE)),
         result = if_else(to_fill,
                          zoo::na.locf(value, na.rm = FALSE),
                          pmax(first(value), zoo::na.locf(value, na.rm = FALSE))),
    )

all(dd$goal == dd$result)
# [1] TRUE

如您所见,resultgoal列完全匹配。