在 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))
我有一些患者有基线疼痛评分和 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))