【问题标题】:R - Collapse Data by Grouped Row ObservationsR - 按分组行观察折叠数据
【发布时间】:2023-03-07 12:07:01
【问题描述】:

我正在处理住院记录的大型数据框。许多患者有两次或多次住院,他们过去的病史可能在一次或多次住院时不完整。我想将他们每次住院的所有信息汇总到每个患者的医疗问题列表中。

这是一个示例数据框:

 id <- c("123","456","789","101","123","587","456","789")
 HTN <- c(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
 FALSE)
 DM2 <- c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE)
 TIA <- c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE)
 df <- data.frame(id,HTN,DM2,TIA)
 df

结果:

 > df
    id   HTN   DM2   TIA
 1 123  TRUE FALSE  TRUE
 2 456 FALSE FALSE  TRUE
 3 789 FALSE  TRUE  TRUE
 4 101 FALSE  TRUE  TRUE
 5 123 FALSE FALSE FALSE
 6 587  TRUE  TRUE  TRUE
 7 456 FALSE FALSE  TRUE
 8 789 FALSE  TRUE  TRUE

我希望我的输出如下所示:

  id <- c("101","123","456","587","789")
  HTN <- c(FALSE,TRUE,FALSE,TRUE,FALSE)
  DM2 <- c(TRUE,FALSE,FALSE,TRUE,TRUE)
  TIA <- c(TRUE,TRUE,TRUE,TRUE,TRUE)
  df2 <- data.frame(id,HTN,DM2,TIA)
  df2

    id  HTN  DM2 TIA
 1 101 FALSE  TRUE TRUE
 2 123  TRUE FALSE TRUE
 3 456 FALSE FALSE TRUE
 4 587  TRUE  TRUE TRUE
 5 789 FALSE  TRUE TRUE

到目前为止,我有一个很好的预感,即安排和分组我的数据是正确的起点,我认为我可以通过为每个医疗问题创建一个新变量来使其发挥作用。不过,我有大约 30 个医疗问题需要以这种方式崩溃,而那么多重复的代码似乎是一个神秘错误的秘诀。

 df3 <- df %>%
   arrange(id) %>%
   group_by(id)

环顾四周,我无法找到一种特别优雅的方式来解决这个问题。是否有一些我忽略的 dplyr 功能?

【问题讨论】:

    标签: r dataframe dplyr data-analysis data-cleaning


    【解决方案1】:

    我们可能会使用

    df %>% group_by(id) %>% summarize_all(any)
    # A tibble: 5 x 4
    #   id    HTN   DM2   TIA  
    #   <fct> <lgl> <lgl> <lgl>
    # 1 101   FALSE TRUE  TRUE 
    # 2 123   TRUE  FALSE TRUE 
    # 3 456   FALSE FALSE TRUE 
    # 4 587   TRUE  TRUE  TRUE 
    # 5 789   FALSE TRUE  TRUE
    

    按照您的建议,我们首先确实按id 分组。然后我们summarizeall 带有函数any 的变量:我们提供一个逻辑向量(例如,HTN 用于患者101)并返回TRUE,如果在我们有TRUE 的任何行中否则FALSE

    【讨论】:

    • 这对我来说效果很好。我遇到的唯一问题是我的数据框实际上包含我想保留的其他一些列,这些列被 summarise_all 消除了。这很容易通过制作一个单独的关键数据帧、使用并使用 left_join 重新组合两个帧来克服。
    • @BrianErly,太好了。你也可以看看summarize_at,也许很容易指定你想要总结的列的名称。
    【解决方案2】:

    基本的 R 选项是

    aggregate(.~ id, df, any)
    #   id   HTN   DM2  TIA
    #1 101 FALSE  TRUE TRUE
    #2 123  TRUE FALSE TRUE
    #3 456 FALSE FALSE TRUE
    #4 587  TRUE  TRUE TRUE
    #5 789 FALSE  TRUE TRUE
    

    rowsum

    rowsum(+(df[-1]), group = df$id) > 0
    

    【讨论】:

      【解决方案3】:

      如果我们更喜欢data.table,我们可以使用:

      setDT(df)[, lapply(.SD, any), keyby = id]
          id   HTN   DM2  TIA
      1: 101 FALSE  TRUE TRUE
      2: 123  TRUE FALSE TRUE
      3: 456 FALSE FALSE TRUE
      4: 587  TRUE  TRUE TRUE
      5: 789 FALSE  TRUE TRUE
      

      【讨论】:

        猜你喜欢
        • 2017-06-29
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2022-11-19
        相关资源
        最近更新 更多