第一次观察发生后替换NA [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我有数据包含“username”行,然后是2016-09-06到2017-09-30每天的列,其中每一天都是一列。

在观察发生的日子里,每个用户都有值L,T和C.没有观察的日期我有NA。

我想用L替换NA,但仅在用户进行了第一次观察之后。所以:

NA NA NA L T C将变为NA NA NA L L L TC

我的数据中有一小部分,但不知道如何将其插入到问题中。如果需要,请告诉我如何提供。

提前致谢。

r na
2个回答
1
投票

我们可以做到

library(zoo)
na.locf(vec, na.rm = FALSE)
#[1] NA  NA  NA  NA  "L" "L" "L" "L" "T" "C"

data

vec <- c(NA, NA, NA, NA, 'L', NA, NA, 'L', 'T', 'C') 

1
投票

na.locf0(x)将使用NA中的最后一个值填充x值,同时保留前导NA值,使其输出与输入的长度相同;因此,如果na.locf(x)中的位置不是NA,但NA中的x位置相同,那么na.locf0就会填充它。这些位置在下面的代码中显示的逻辑表达式中的值为TRUE,因此在这些位置设置x的值到"L"。我们使用replace非破坏性地进行(即我们输出所需的矢量而不修改x本身)。

library(zoo)

x <- c(NA, NA, NA, NA, "L", NA, NA, "L", "T", "C") # test data
replace(x, !is.na(na.locf0(x)) & is.na(x), "L")
## [1] NA  NA  NA  NA  "L" "L" "L" "L" "T" "C"

Note

如果我们知道要填写的所有NAs都遵循L(如问题中的示例数据)那么

na.locf0(x)

就足够了;但是,如果一般情况如问题所述,则需要上面的replace代码。

Variation

上面的变化是用NA替换所有"L"值,然后用NA替换na.locf0(x)NA的位置。

replace(replace(x, is.na(x), "L"), is.na(na.locf0(x)), NA)
## [1] NA  NA  NA  NA  "L" "L" "L" "L" "T" "C"
© www.soinside.com 2019 - 2024. All rights reserved.