这个问题在这里已有答案:
我有数据包含“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
我的数据中有一小部分,但不知道如何将其插入到问题中。如果需要,请告诉我如何提供。
提前致谢。
我们可以做到
library(zoo)
na.locf(vec, na.rm = FALSE)
#[1] NA NA NA NA "L" "L" "L" "L" "T" "C"
vec <- c(NA, NA, NA, NA, 'L', NA, NA, 'L', 'T', 'C')
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"
如果我们知道要填写的所有NAs都遵循L
(如问题中的示例数据)那么
na.locf0(x)
就足够了;但是,如果一般情况如问题所述,则需要上面的replace
代码。
上面的变化是用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"