背景
我需要根据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的情况。
答案 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
如您所见,result
与goal
列完全匹配。