查找每行的最后一个非缺失值

Lul*_*ulY 3 r dplyr rowwise

我有一个数据框,其中包含在时间点 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 包中执行此操作?

Maë*_*aël 7

您可以使用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)


Jil*_*ina 5

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)