【问题标题】:How to reshape a dataframe into percentage of categorical data如何将数据框重塑为分类数据的百分比
【发布时间】:2019-04-03 11:36:22
【问题描述】:

我有一个包含纵向信息(长格式)的数据框。

mydata<-structure(list(record_id = c("a", "a", "a", "b", "b", "b", "c", "c","c"),event = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label =c("e2", "e3", "e4"), class = "factor"), var1 = structure(c(2L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L), .Label = c("no", "yes"), class = "factor"),var2 =structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("no", "yes"), class = "factor"), var3 = structure(c(2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L),.Label = c("no", "yes"), class = "factor")), row.names = c(NA, -9L), class= c("tbl_df", "tbl", "data.frame"))

我需要将这些数据转换成一个数据框,根据事件 (e2,e3,e4) 总结每个变量 (var1,var2,var3) 的“是”计数的百分比,以便具有如下内容:

mydata_result<-structure(list(Event = structure(c(1L, 1L, 1L, 2L, 2L, 2L,3L, 3L, 3L), .Label = c("e2", "e3", "e4"), class = "factor"), Variable =structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("var1", "var2", "var3"), class = "factor"), percentage_of_yes = c(0.33, 0.33, 0.66, 0, 0.33, 0.66, 0, 0, 0)), row.names = c(NA, -9L), class = c("tbl_df", "tbl","data.frame"))

谢谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    使用tidyverse,我们可以转换为长格式,按我们的变量和事件分组,并进行百分比计数,即

    library(tidyverse)
    
    mydata %>% 
      gather(var, val, -c(1:2)) %>% 
      group_by(event, var) %>% 
      summarise(new = sum(val == 'yes')/n())
    

    给出,

    # A tibble: 9 x 3
    # Groups:   event [?]
      event var     new
      <fct> <chr> <dbl>
    1 e2    var1  0.333
    2 e2    var2  0.333
    3 e2    var3  0.667
    4 e3    var1  0    
    5 e3    var2  0.333
    6 e3    var3  0.667
    7 e4    var1  0    
    8 e4    var2  0    
    9 e4    var3  0    
    

    【讨论】:

    • 谢谢 Sotos,最后一个问题。在一些变量(var1,var2)中我有遗漏,但是当我运行你的代码时,% 的计算考虑了整个 n(即使有 NA 的数量),我试图把 na.rm=TRUE 放在sum 函数,但它不起作用,知道吗?
    • 事先过滤掉它们怎么样?比如在summarise()之前,可以加一个过滤器,即...%&gt;%filter(!is.na(val)) %&gt;% summarise()
    【解决方案2】:

    这是data.table的替代方法

    library(data.table)
    melt(setDT(mydata), id.vars = c("record_id", "event"))[, 
     .(percentage_of_yes = round(mean(value == "yes"), 3)), 
            .(event, Variable = variable)]
    #    event Variable percentage_of_yes
    #1:    e2     var1             0.333
    #2:    e3     var1             0.000
    #3:    e4     var1             0.000
    #4:    e2     var2             0.333
    #5:    e3     var2             0.333
    #6:    e4     var2             0.000
    #7:    e2     var3             0.667
    #8:    e3     var3             0.667
    #9:    e4     var3             0.000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2019-05-02
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多