我有一些纵向的患者数据,其中包括一列描述患者目前是否或曾经吸烟的列.如果患者后来被登记为从未吸烟,我想回填缺失的值only.我不能简单地使用tiydr::fill,因为它不允许对值进行歧视.
给出下面的例子,我希望将S的id==1
改为never_smoker
,而id==2
应该保持不变,因为我们无法准确地推断患者何时开始吸烟.
df <- tibble::tribble(
~id, ~visit, ~smoking,
1, 1, NA,
1, 2, NA,
1, 3, "never_smoker",
2, 1, NA,
2, 2, NA,
2, 3, "current_smoker"
)
应该会导致
expected_result <- tibble::tribble(
~id, ~visit, ~smoking,
1, 1, "never_smoker",
1, 2, "never_smoker",
1, 3, "never_smoker",
2, 1, NA,
2, 2, NA,
2, 3, "current_smoker"
)
我想出了这个解决方案,看起来很管用,但需要颠倒两次.我想一定有更好的方法来做这件事吧?
df %>%
group_by(id) %>%
mutate(smoking = rev(accumulate(rev(smoking), ~ ifelse(is.na(.y) & .x == "never_smoker", "never_smoker", .y))))