在 R 中,我如何编写代码来分析在任何给定时间点进行随访的患者?

In R, how do I code to analyse patients with follow up at any given time point?

我有一些患者有基线疼痛评分和 6 个月、1 年和 2 年的随访(每个都有自己的变量列)。我有 26,000 多名患者。在这些不同的时间点缺少数据。我可以很容易地分析一年的疼痛评分结果,不包括缺失、6 个月和两年等……我想做的是分析那些有 6 个月、一年或两年数据的结果。有些患者会有不止一个,有些患者会缺少所有三个的数据。任何想法如何编码这个?也许另一列带有 mutate() ... 创建 'vas.outcome' 然后在这个变量中我可以有一年的数据,如果缺少一年然后两年,如果缺少两年然后 6 个月.如果三个都缺失,则编码为 NA。

# A tibble: 6 x 4
        vas.base      vas.6mth       vas.year      vas.two
          <dbl>         <dbl>         <dbl>         <dbl>
1           5            NA              NA           4
2           9            2.3             1.2          NA
3           8.1          NA              NA           NA
4           10           NA              NA           3.3
5           6.5          6.5             NA           NA
6           8            NA              NA           3

我不是 100% 确定您希望最终数据集是什么样子,而且我相信还有更优雅的方法,但是要选择结果的第一次出现(在基线之后),您可以:

数据

df <- read.table(text = "id        vas.base      vas.6mth       vas.year      vas.two
1           5            NA              NA           4
2           9            2.3             1.2          NA
3           8.1          NA              NA           NA
4           10           NA              NA           3.3
5           6.5          6.5             NA           NA
6           8            NA              NA           3", header = TRUE)

dplyr方法:

library(tidyr)
df %>% pivot_longer(starts_with("vas")[-1], names_to = "visit") %>%
  group_by(id) %>% mutate(vas.outcome = first(na.omit(value))) %>% 
  slice(1) %>% select(id, vas.outcome) %>% 
  left_join(df, by = "id")

输出:

#      id vas.outcome vas.base vas.6mth vas.year vas.two
# <int>       <dbl>    <dbl>    <dbl>    <dbl>   <dbl>
# 1     1         4        5        NA       NA       4  
# 2     2         2.3      9        2.3      1.2      NA  
# 3     3         NA       8.1      NA       NA       NA  
# 4     4         3.3      10       NA       NA       3.3
# 5     5         6.5      6.5      6.5      NA       NA  
# 6     6         3        8        NA       NA       3  

您可以使用 case_when()/fcase() 方法

dt[, pain:=fcase(
  !is.na(vas.year), vas.year,
  !is.na(vas.two), vas.two,
  !is.na(vas.6mth), vas.6mth,
  default = NA
)]

dt %>% 
  mutate(pain:=case_when(
    !is.na(vas.year)~vas.year,
    !is.na(vas.two)~vas.two,
    TRUE~vas.6mth
  ))

输出:

   vas.base vas.6mth vas.year vas.two pain
1:      5.0       NA       NA     4.0  4.0
2:      9.0      2.3      1.2      NA  1.2
3:      8.1       NA       NA      NA   NA
4:     10.0       NA       NA     3.3  3.3
5:      6.5      6.5       NA      NA  6.5
6:      8.0       NA       NA     3.0  3.0

一种方法:

library(dplyr)

your_data_frame %>%
  mutate(vas.outcome = coalesce(vas.6mth, vas.year, vas.two))