gpt4 book ai didi

r - 是否有更简洁的方法来子集和提取 R 数据集中最早的诊断和代码?

转载 作者:行者123 更新时间:2023-12-03 07:54:29 24 4
gpt4 key购买 nike

我有一个数据集,我试图确定疾病的最早诊断,以及与该诊断相关的代码。这是我正在使用的文件的一个更短的版本。

不幸的是,第一个疾病代码并不总是最早的诊断,如ID 1005

df = data.frame(ID = c(1001, 1002, 1003, 1004, 1005),
Disease_code_1 = c('I802', 'G200','I802',NA, 'H356'),
Disease_code_2 = c('A071',NA,'G20',NA,'I802'),
Disease_code_3 = c('H250', NA,NA,NA,NA),
Date_of_diagnosis_1 = c('12/06/1997','13/06/1997','14/02/2003',NA,'18/03/2005'),
Date_of_diagnosis_2 = c('12/06/1998',NA,'18/09/2001',NA,'12/07/1993'),
Date_of_diagnosis_3 = c('17/09/2010',NA,NA,NA,NA))

ID Disease_code_1 Disease_code_2 Disease_code_3 Date_of_diagnosis_1 Date_of_diagnosis_2 Date_of_diagnosis_3
1 1001 I802 A071 H250 12/06/1997 12/06/1998 17/09/2010
2 1002 G200 <NA> <NA> 13/06/1997 <NA> <NA>
3 1003 I802 G20 <NA> 14/02/2003 18/09/2001 <NA>
4 1004 <NA> <NA> <NA> <NA> <NA> <NA>
5 1005 H356 I802 <NA> 18/03/2005 12/07/1993 <NA>

我尝试为每个代码和日期创建变量的多个子集,如下所示,行绑定(bind),然后仅保留最早的诊断,但是,当考虑到我需要的所有其他协变量和变量时,它相当冗长包括。

Disease_1 <- as.data.frame((cbind(df$ID, df$Disease_code_1, df$Date_of_diagnosis_1)))
Disease_2 <- as.data.frame((cbind(df$ID, df$Disease_code_2, df$Date_of_diagnosis_2)))
Disease_3 <- as.data.frame((cbind(df$ID, df$Disease_code_3, df$Date_of_diagnosis_3)))

Disease_data <- rbind(Disease_1, Disease_2, Disease_3)
colnames(Disease_data) = c("id","Disease_code","Date_of_diagnosis")

#Edit Diseasedate to only include a participant once based on earliest diagnosis
Disease_data <- Disease_data [order(Disease_data [,'id'],Disease_data [,'Date_of_diagnosis']),]
Disease_data <- Disease_data [!duplicated(Disease_data $id),]

这是一个简化版本,但我会对 Disease_ 数据帧进行超过 25 次迭代,每个数据帧大约有 100 个变量,虽然可以工作,但非常笨重,如果可能的话希望使其更简洁。

我知道编辑数据以仅包含最早的参与者已经非常简洁,但这是此方法的设置。有没有办法使用可能有效的 startswith 命令?我尝试过,但没有成功。

最佳答案

您的数据在这里很难处理,因为它的格式很宽 - convert it to long-form解决起来就会容易得多。 :

使用 tidyverse 中的 dplyr 包,我们获取除 ID 之外的所有列,并将它们转换为名称-值对,每个一个单独的行。由于示例变量名称具有模式 [TYPE OF VALUE]_[SEQUENTIAL NUMBER],我们可以在 names_pattern 参数中使用正则表达式将值名称拆分为 name 列,其中包含测量类型(此处继续“Disease_code”或“Date_of_diagnosis”)和该序列号。

然后,我们将其扩大,以创建单个 Disease_codeDate_of_diagnosis 列,每个 ID 和数字组合各占 1 行。最后,我们将 Date_of_diagnosis 转换为日期格式(使用 lubridate::dmy 因为它是日/月/年格式),以便正确排序,然后过滤掉行其中,Disease_code 为 NA,这意味着那里没有值:

library(tidyverse)

df2 <- df %>%
pivot_longer(-ID,
names_pattern = "(.*)_([0-9]*$)",
names_to = c('name', 'num')) %>%
pivot_wider() %>%
mutate(Date_of_diagnosis = dmy(Date_of_diagnosis)) %>%
filter(!is.na(Disease_code))

df2
# A tibble: 8 × 4
ID num Disease_code Date_of_diagnosis
<dbl> <chr> <chr> <date>
1 1001 1 I802 1997-06-12
2 1001 2 A071 1998-06-12
3 1001 3 H250 2010-09-17
4 1002 1 G200 1997-06-13
5 1003 1 I802 2003-02-14
6 1003 2 G20 2001-09-18
7 1005 1 H356 2005-03-18
8 1005 2 I802 1993-07-12

现在数据格式正确,我们可以按 ID 分组并为每个数据选择最早的日期(最小值):

df2 %>%
group_by(ID) %>%
slice_min(Date_of_diagnosis)

ID num Disease_code Date_of_diagnosis
<dbl> <chr> <chr> <date>
1 1001 1 I802 1997-06-12
2 1002 1 G200 1997-06-13
3 1003 2 G20 2001-09-18
4 1005 2 I802 1993-07-12

关于r - 是否有更简洁的方法来子集和提取 R 数据集中最早的诊断和代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76378266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com