如何针对每个患者按行获取最后一次测量数据?

3

使用这个数据集,我想要获取每个个体可用的最后一次观察。

ID <- c(1:5)
Age <- c(23,34,26,18,35)
day1 <- c(NA,NA,NA,4,2)
day2 <- c(NA,3,NA,NA,NA)
day3 <- c(2,NA,3,NA,4)
last_value <- c(2,3,3,4,4)

mydata <- data.frame(ID, Age, day1, day2, day3)

   ID  Age day1 day2 day3 last_value
1   1   23   NA   NA    2          2
2   2   34   NA    3   NA          3
3   3   26   NA   NA    3          3
4   4   18    4   NA   NA          4
5   5   35    2   NA    4          4

“get the last observation available”是什么意思?您想要看到什么输出,大概需要提供哪些输入才能得到该输出? - Marijn
3个回答

2
library(tidyverse)
mydata %>% 
  pivot_longer(-c(ID, Age)) %>% 
  group_by(ID) %>% 
  drop_na() %>% 
  mutate(last_value = last(value)) %>% 
  pivot_wider(names_from = name, values_from = value)

# A tibble: 5 × 6
# Groups:   ID [5]
     ID   Age last_value  day3  day2  day1
  <int> <dbl>      <dbl> <dbl> <dbl> <dbl>
1     1    23          2     2    NA    NA
2     2    34          3    NA     3    NA
3     3    26          3     3    NA    NA
4     4    18          4    NA    NA     4
5     5    35          4     4    NA     2

2
你可以在 pivot_longer 中添加 values_drop_na = T 来避免使用 drop_na(),并且在 pivot_wider 中添加 names_sort = T 来对列名进行排序。 - Darren Tsai

2

使用 base R

mydata$last_value <- apply(mydata[-(1:2)], 1, \(x) tail(x[!is.na(x)], 1))

-输出

> mydata
  ID Age day1 day2 day3 last_value
1  1  23   NA   NA    2          2
2  2  34   NA    3   NA          3
3  3  26   NA   NA    3          3
4  4  18    4   NA   NA          4
5  5  35    2   NA    4          4

或者使用 exec + coalesce

library(dplyr)
library(purrr)
mydata %>% 
  mutate(last_value = exec(coalesce, !!! rlang::syms(names(.)[5:3])))

2
使用 dplyr,您可以 select() 选择需要的列,rev() 将它们按相反顺序排列,然后使用 coalesce() 找到每行的第一个非缺失元素。
library(dplyr)

mydata %>%
  mutate(last_value = coalesce(!!!rev(select(., starts_with("day")))))

  ID Age day1 day2 day3 last_value
1  1  23   NA   NA    2          2
2  2  34   NA    3   NA          3
3  3  26   NA   NA    3          3
4  4  18    4   NA   NA          4
5  5  35    2   NA    4          4

同时使用acrossdo.call

mydata %>%
  mutate(last_value = do.call(coalesce, rev(across(starts_with("day")))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接