【问题标题】:How do you aggregate rows to a factor variable with three levels?如何将行聚合到具有三个级别的因子变量?
【发布时间】:2020-03-29 12:26:20
【问题描述】:

我有一个数据集,其中一些参与者有多行,我需要以每个参与者只有一行的方式聚合数据。数据集包含不同的变量类型(例如,因素、日期、年龄等)。我编写了一个有效的代码,如下所示:

example4 <- SMARTdata_50j_diagc_2016  %>% 
  group_by( Patient_Id ) %>%  
  summarise( Groep = first( Groep ),
             Ziekenhuis_Nr = first( Ziekenhuis_Nr ),
             Ziekenhuistype = first( Ziekenhuistype ),
             aantalDBC = n(),
             aantalVervolg = sum( as.numeric( Zorgtype_Code ) ),
             Leeftijd = mean( Lft_patient_openenDBC ),
             MRI_nee_ja = max( ifelse( MRI_nee_ja == 0, 0, 1 ) ),
             aantalMRI = sum( MRI_Aantal ),
             Artroscopie_nee_ja = max( ifelse( Artroscopie_nee_jaz_jam == 0, 0, 1 ) ),
             aantalArtroscopie = sum( Artroscopie_aantal ),
             overigDBC = mean( Aantal_overigeDBC_bijopenen ),
             DBC_open = min( open_DBC ), 
             DBC_sluiten = max( sluiten_DBC ) ) %>% 
  as.data.frame()

此代码为每个参与者提供了一行。但是,我还有一个变量需要包含在新数据框中,但我不知道该怎么做。我需要添加的变量名为“Diagnose_Code”,它是具有两个级别的因子,即 0(代表 1801)和 1(代表 1805)。

对于具有多行的参与者(在原始数据框中),有些参与者的该变量同时具有 0 和 1。现在,在我的新数据框中,我想为“Diagnose_Code”创建一个具有三个级别的变量:如果该参与者的所有行都是 0,则为 0,如果该参与者的所有行都是 1,则为 1,如果该参与者的行为 2,则为 2该参与者同时具有 0 和 1。

我不知道如何使这项工作。我在 ifelse 代码上有点挣扎,但没有成功。有谁知道我如何在我的代码中完成这项工作?先感谢您!

【问题讨论】:

    标签: r dplyr aggregate plyr


    【解决方案1】:

    使用玩具数据集可以这样实现:

    library(dplyr)
    
    df <- data.frame(
      id = rep(1:3, each = 3),
      diagnosis_code = c(rep(1,3), rep(0, 3), c(1, 0, 1)),
      stringsAsFactors = FALSE
    )
    df %>% 
      group_by(id) %>% 
      summarise(diagnosis_code = case_when(
        all(diagnosis_code == 1) ~ 1,
        all(diagnosis_code == 0) ~ 0,
        TRUE ~ 2
      ))
    #> # A tibble: 3 x 2
    #>      id diagnosis_code
    #>   <int>          <dbl>
    #> 1     1              1
    #> 2     2              0
    #> 3     3              2
    

    reprex package (v0.3.0) 于 2020 年 3 月 29 日创建

    【讨论】:

    • 我的荣幸。如果你想帮我一个忙:将问题标记为已回答。除了给我或其他人一些功劳外,它还向其他有类似问题的人表明该解决方案有效,并将该问题从仍在等待答案的问题队列中删除。
    • 再次感谢您,我已将问题标记为已回答。
    【解决方案2】:

    使用 ifelse 应该可以工作:

    df %>%
    group_by(id) %>%
      summarise(diag=ifelse(max(diag)!=min(diag), 2, 
                              ifelse(max(diag==1), 1, 0)))
    

    # A tibble: 3 x 2
         id  diag
      <dbl> <dbl>
    1     1     2
    2     2     1
    3     3     0
    

    数据

    df <- data.frame(id=c(1,1,1,2,2,2,3,3,3), diag=c(1,0,0,1,1,1,0,0,0))
    

    【讨论】:

      【解决方案3】:
      df %>% 
        group_by(Patient_Id) %>% 
        summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3, 
                                            sum(Diagnose_Code) ==  1 ~ 1, 
                                            TRUE ~ 0 ))
      

      【讨论】:

        猜你喜欢
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2020-03-27
        相关资源
        最近更新 更多