我有一个数据框,其中包含在时间点 0 到 2 测量的变量var。如下所示:
df <- data.frame(id= letters[1:5],
var0= c(1:3, NA, 5),
var1= c(11, NA, NA, 14:15),
var2= c(NA, NA, NA, NA, 25))
df
id var0 var1 var2
1 a 1 11 NA
2 b 2 NA NA
3 c 3 NA NA
4 d NA 14 NA
5 e 5 15 25
Run Code Online (Sandbox Code Playgroud)
对于每一行,即对于每个人,我想保留最新的非缺失值。所以期望的输出是:
id var0 var1 var2 last_val
1 a 1 11 NA 11
2 b 2 NA NA 2
3 c 3 NA NA 3
4 d NA 14 NA 14
5 e 5 15 25 25
Run Code Online (Sandbox Code Playgroud)
如何在 tidyverse 包中执行此操作?
您可以使用coalesce。诀窍是反转变量的顺序,coalesce以便返回实际数据中的最后一个非 NA 值:
library(dplyr)
df |>
mutate(last_val = coalesce(var2, var1, var0))
# id var0 var1 var2 last_val
# 1 a 1 11 NA 11
# 2 b 2 NA NA 2
# 3 c 3 NA NA 3
# 4 d NA 14 NA 14
# 5 e 5 15 25 25
Run Code Online (Sandbox Code Playgroud)
如果你想使用tidy选择,你可以coacross先定义一个函数,然后rev删除顺序。有关使用acrosswith的更多信息请coalesce 参见此处。
coacross <- function(...) {
coalesce(!!!across(...))
}
df |>
mutate(last_val = coacross(rev(contains("var"))))
Run Code Online (Sandbox Code Playgroud)
R 基础替代方案:
> df$last_val <- apply(df, 1, \(x) tail(na.omit(x), 1))
> df
id var0 var1 var2 last_val
1 a 1 11 NA 11
2 b 2 NA NA 2
3 c 3 NA NA 3
4 d NA 14 NA 14
5 e 5 15 25 25
Run Code Online (Sandbox Code Playgroud)