Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R用结转的最后一次观察值(NA.LOCF)替换间歇NA值_R_Dplyr_Zoo - Fatal编程技术网

R用结转的最后一次观察值(NA.LOCF)替换间歇NA值

R用结转的最后一次观察值(NA.LOCF)替换间歇NA值,r,dplyr,zoo,R,Dplyr,Zoo,背景 我需要根据NA的性质使用不同的方法来替换数据框中的NA。我的数据框架来自一项重复测量的研究,其中一些Na是受试者辍学的结果,而另一些是间歇性缺失测量的结果,定义为一个或多个缺失测量序列,然后是测量值。 我将间歇性缺失测量称为间歇性NA 问题 我很难测试NA是否是间歇性缺失测量的结果,以及我应该使用什么功能来替换这些NA。理想情况下,我会用NA.locf方法替换这些间歇性NA。但我需要用基线或最后观察到的值替换掉掉NA,以较大者为准 示例 示例1 这是一个干净的NA示例,我希望通过NA.lo

背景

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

问题

我很难测试NA是否是间歇性缺失测量的结果,以及我应该使用什么功能来替换这些NA。理想情况下,我会用NA.locf方法替换这些间歇性NA。但我需要用基线或最后观察到的值替换掉掉NA,以较大者为准

示例

示例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))
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))
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))
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))
示例2

下面是一个干净的NA(辍学NA)示例,我希望通过之前的非NA观察或基线值(第1次就诊)来估算,以最大值为准:

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,34,34,15,16,19,19,12,23,31))
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))
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))
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))
示例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(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(34,34,34,15,16,19,19,12,23,31))
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))
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))
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))
示例4

另一个复杂的例子是,基线观察(第1次就诊)大于辍学NA的先前非NA值:

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(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(34,34,34,15,16,19,19,12,23,31))
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))
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))
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))
但这无助于我输入所有间歇性NA,尤其是序列中的间歇性NA(NA1,NA2,NA3,14),其中只有NA3在运行此测试后返回为真。

我们可以使用
NA.locf(…,fromLast=真)
识别尾随的
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

如您所见,
结果
目标
列完美匹配。

您并没有真正给出定义,但似乎您将“间歇NA”定义为前后无缺失值的
NA
。这是正确的吗?或者你有其他的定义吗?或者,你不在乎有多少个
NA
值,只要后面有非NA值?而且,从你的例子来看,如果最后只有一个
NA
,那么这也被认为是间歇性的?如果你展示了一些你不想填充的
NA
s的实例,这将是一个更好的问题,除了你已经展示了
NA.locf
按预期工作的例子之外“如果有一种方法可以测试在非NA测量之后是否有NA,这将解决我的问题”,这是有效的:
mutate(is.NA(value)&!is.NA(lead(value)))
。但对于最后一个值,它将返回
FALSE
,因为它是
NA
,后面没有非NA值。很抱歉,我没有正确定义@Gregor的意思。在这种情况下,我所指的间歇性NAs是一个或一个序列的NAs,最终后跟一个非NA值。基本上,只要有“NA通道”末端的非NA值“,应将其视为间歇性NA。如果最后一个值为NA,第二个最后一个值为非NA,则该值将被视为辍学导致的NA,而不被视为间歇性NA,无论之前的NA是如何处理的。我会立即尝试你的建议。@Nowak正如Gregor所说,如果你能提供包含你所做和不想替换的
NA
s的样本数据,那将非常有帮助。您的问题陈述对我来说仍然有些模糊,可能是由于非传统术语“本质上,当“NA通道”末端存在非NA值时,应将其视为间歇性NA。”Hi@Gregor。fromLast的伟大思想=真的!这就是我想做的。您知道如何通过在从最后一个可用的非NA值开始的每3次就诊间隔后添加+2来估算辍学NA吗?因此,如果第一次退出NA发生在第二次访视中,第1次访视的观察值为34,那么:(访视=c(1,2,3,4,5,6,7,8,8,9,10)值=c(34,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)需要是(访视=c(1,2,3,4,5,6,7,8,9,10)值=c(34,34,34,36,36,38,38,40))如果你有新问题,问一个新问题。带有
rep
seq
的功能应该可以使用。我将添加一个新问题。如果您有答案,这是我的新问题:)