【问题标题】:Include 0 counts as frequency and create new columns [duplicate]包括 0 个计数作为频率并创建新列 [重复]
【发布时间】:2019-03-20 23:06:42
【问题描述】:

假设我有一个 data.frame

df = data.frame ( 
    sample = c ( "s1","s2","s2"), 
    drug = c( "drug2" , "drug1", "drug2")
)

  sample  drug
1     s1 drug2
2     s2 drug1
3     s2 drug2

是否有任何简单的方法可以创建一个表格来计算所有药物实例(包括零命中)?

理想情况下,是这样的。

samle drug1 drug2
1    s1     0     1
2    s2     1     1

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    base R 的老旧 table 怎么样?

    table(df)
    #      drug
    #sample drug1 drug2
    #s1     0     1
    #s2     1     1
    

    或获取matrix 输出

    as.data.frame.matrix(table(df))
    #   drug1 drug2
    #s1     0     1
    #s2     1     1
    

    【讨论】:

      【解决方案2】:

      这可以通过dplyr 完成。 dplyr 的最新版本(撰写本文时为 0.8.0.1)有一个 .drop=FALSE 选项,用于对保留空组的变量进行分组。为了保留空组,分组列必须都是因子类:

      library(dplyr)
      library(tidyr)
      
      df %>% 
        # Convert grouping columns to factor if they aren't already
        mutate_if(is.character, factor) %>% 
        group_by(sample, drug, .drop=FALSE) %>% 
        tally %>% 
        spread(drug, n)
      
        sample drug1 drug2
      1 s1         0     1
      2 s2         1     1
      

      或者,要将输出保持为“长”格式以供进一步处理,请在 spread 之前停止:

      df %>% 
        mutate_if(is.character, factor) %>% 
        group_by(sample, drug, .drop=FALSE) %>% 
        tally
      
        sample drug      n
      1 s1     drug1     0
      2 s1     drug2     1
      3 s2     drug1     1
      4 s2     drug2     1
      

      以上代码将确保保留所有空组组合。但是,如果您要将数据分散到“宽”格式的表中,那么我们可以处理 spread 步骤中缺少的组,而不必担心 group_by 是否保留空组:

      df %>% 
        group_by(sample, drug) %>% 
        tally %>% 
        spread(drug, n, fill=0)
      

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2012-03-29
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        相关资源
        最近更新 更多