【问题标题】:Based on patient data from one row, subset that patient's other rows基于一行中的患者数据,对该患者的其他行进行子集化
【发布时间】:2020-10-07 18:38:57
【问题描述】:

我有 1000 名患者来我的诊所进行了三次就诊(就诊 1、就诊 2、就诊 3)。在数据框中,每次访问都注册为一个新行,所以我有 3000 行。创建数据时,仅为每一行输入新信息,因此性别信息仅存在于每个患者的 visit1 行中,并且由于我们在 visit3 筛查癌症,因此该行只能为该列输入“是”或“否”, visit2 和 visit1 的列为空。

我要做的是分析在访问3时接受癌症诊断但所有特征都在访问1中的患者的特征。

我已经这样做了:

cancerdiagnosed <- subset(alldata, cancerdiagnosis =='Yes')

但现在我只有患者被诊断患有癌症的行,缺乏性别数据等等。我想获取我获得的那些患者编号,并使用这些编号来代替这些患者的子集首次就诊。

【问题讨论】:

  • 请您使用dput(head(data)) 并将输出添加到主帖 - 这将帮助人们给出更好的答案。如果数据包含私人数据,您可以对其进行审查。谢谢。
  • 这不是一个罕见的问题。但是,如果您要提供数据的样例,这可能会有所帮助(尝试使用dput(head(alldata)) 的结果编辑您的问题)。此外,请提供您的“子集”(cancerdiagnosed)应该是什么样子。每个患者应该有一行,包括所有数据吗?现在,请查看 this post,它展示了如何在组中填写缺失值(或者在您的情况下,在单个患者中填写性别信息)。

标签: r


【解决方案1】:

这是一个加入的解决方案。首先,我用附加信息制作一个表格,然后用left_join 将其添加到原始数据的其余部分:

test_data <- data.frame(
  patient_id = rep(c("A", "B"), each = 3),
  visit = rep(1:3, 2),
  gender = c("male", NA, NA, "female", NA, NA),
  cancerdiagnosis = c(NA, NA, "Yes", NA, NA, "No")
)

test_data
#>   patient_id visit gender cancerdiagnosis
#> 1          A     1   male            <NA>
#> 2          A     2   <NA>            <NA>
#> 3          A     3   <NA>             Yes
#> 4          B     1 female            <NA>
#> 5          B     2   <NA>            <NA>
#> 6          B     3   <NA>              No

library(dplyr)

# make a table with the general information
patient_information <- test_data %>% 
  filter(visit == 1) %>% 
  select(patient_id, gender)

patient_information
#>   patient_id gender
#> 1          A   male
#> 2          B female

# join this with the complete table
data_complete <- test_data %>% 
  select(-gender) %>% 
  left_join(patient_information, by = "patient_id")

data_complete
#>   patient_id visit cancerdiagnosis gender
#> 1          A     1            <NA>   male
#> 2          A     2            <NA>   male
#> 3          A     3             Yes   male
#> 4          B     1            <NA> female
#> 5          B     2            <NA> female
#> 6          B     3              No female

reprex package (v0.3.0) 于 2020 年 10 月 7 日创建

【讨论】:

    【解决方案2】:

    这是基于您的描述的示例数据集。

    alldata <- data.frame(patientid = 1:5, 
                          visit = rep(1:3, each = 5))
    alldata$gender <- ifelse(alldata$visit == 1, c("m", "f", "m", "f", "m"), NA)
    alldata$cancerdiagnosis <- ifelse(alldata$visit == 3, c("Yes", "No", "Yes", "No", "Yes"), NA)
    
    

    使用 base R 你可以试试这个:

    # looking for patientids with cancer
    patients <- alldata$patientid[which(alldata$cancerdiagnosis == "Yes")]
    
    # filtering patientids with cancer and the first visit
    alldata4 <- subset(alldata, patientid %in% patients & visit == 1)
    
    
    
      patientid visit gender cancerdiagnosis
    1         1     1      m            <NA>
    3         3     1      m            <NA>
    5         5     1      m            <NA>
    

    一个整洁的方法可能如下所示:

    library(tidyverse)
    
    # looking for patientids with cancer
    patients <- alldata %>% 
      filter(cancerdiagnosis == "Yes") %>% 
      pull(patientid)
    
    # filtering for patientids with cancer and the first visit
    alldata3 <- alldata %>% 
      filter(patientid %in% patients, visit == 1)
    

    您也可以将第一次访问的信息添加到后续访问中。最后,通过对第三次访问进行子集化,您可以获得所需的信息。

    library(tidyverse)
    
    alldata2 <- alldata %>% 
      group_by(patientid) %>%
      fill(gender) %>%
      filter(cancerdiagnosis == "Yes")
    
    
      patientid visit gender cancerdiagnosis
          <int> <int> <chr>  <chr>          
    1         1     3 m      Yes            
    2         3     3 m      Yes            
    3         5     3 m      Yes   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2020-02-04
      • 2012-05-06
      相关资源
      最近更新 更多