重复第一次调查遇到的年龄和性别输入以进行重复的患者调查

Repeat an age and sex input from first survey encounter for repeated patient survey

我正在处理一个大型数据集,其中包含对患者的重复数据调查。在调查的第一个实例中,仅对患者进行了关于他们的性别和年龄的调查,我希望用第一个记录的年龄和性别实例替换后续调查的 N/A 值。我的数据集是“完整的”,年龄和性别分别编码为“年龄”和“性别”。每个患者都由一个 ID 值(“id”)标识。我附上了当前排序的输出以了解数据的外观以及我希望它的外观示例。

目前的样子

       X        id      rec_date  age sex 
1   7987   #VALUE! 3/15/21 12:40 <NA>  NA
2      3 111113280 4/30/20 13:29   76   0 
3     11 111118200 4/30/20 13:38   68   1 
4   1503 111118200 6/12/20 15:07 <NA>  NA
5   6128 111118200  7/25/20 8:35 <NA>  NA
6   9777 111118200   9/4/20 9:57 <NA>  NA
8     12 111118880 4/30/20 13:38   73   1 
9    424 111118880 6/12/20 11:21 <NA>  NA 
10  5738 111118880  7/25/20 7:45 <NA>  NA 
11 12488 111118880   9/7/20 9:34 <NA>  NA 
12   345 111118880  12/7/20 5:25 <NA>  NA
13  7480 111118880 3/11/21 10:00 <NA>  NA  

我想要它的样子

       X        id      rec_date  age sex 
1   7987   #VALUE! 3/15/21 12:40 <NA>  NA
2      3 111113280 4/30/20 13:29   76   0 
3     11 111118200 4/30/20 13:38   68   1 
4   1503 111118200 6/12/20 15:07   68   1
5   6128 111118200  7/25/20 8:35   68   1
6   9777 111118200   9/4/20 9:57   68   1
8     12 111118880 4/30/20 13:38   73   1 
9    424 111118880 6/12/20 11:21   73   1 
10  5738 111118880  7/25/20 7:45   73   1 
11 12488 111118880   9/7/20 9:34   73   1 
12   345 111118880  12/7/20 5:25   73   1
13  7480 111118880 3/11/21 10:00   73   1  

我确信这是一个相当简单的解决方案,我仍然是 R 的新手,非常感谢任何见解。提前致谢!

我花了一些时间来计算你的虚拟数据:

library(tidyverse)

# set up your dummy data from raw text
df <- data.table::fread("X    id rec_day rec_time  age sex 
  7987   #VALUE! 3/15/21 12:40 <NA>  NA
     3 111113280 4/30/20 13:29   76   0 
    11 111118200 4/30/20 13:38   68   1 
  1503 111118200 6/12/20 15:07  NA  NA
  6128 111118200  7/25/20 8:35  NA  NA
  9777 111118200   9/4/20 9:57  NA  NA
    12 111118880 4/30/20 13:38   73   1 
   424 111118880 6/12/20 11:21  NA  NA 
  5738 111118880  7/25/20 7:45  NA  NA 
 12488 111118880   9/7/20 9:34  NA  NA 
   345 111118880  12/7/20 5:25  NA  NA
  7480 111118880 3/11/21 10:00  NA  NA") %>%
      tidyr::unite("rec_date", rec_day:rec_time, remove = TRUE, sep = " ") %>%
      dplyr::mutate(rec_date = lubridate::mdy_hm(rec_date))

df %>%
    # make sure everything is orderes (rec_date needs to be date with time format)
    dplyr::arrange(id, rec_date) %>%
    # build grouping to limit the imputation per id
    dplyr::group_by(id) %>%
    # fill the data down wards
    tidyr::fill_(c("age","sex"), .direction = "down") %>%
    # if needed you could also fill in the other direction
    tidyr::fill_(c("age","sex"), .direction = "up") %>%
    # release grouping to avoid unwanted behaviour down stream
    dplyr::ungroup()