【问题标题】:How to summarize date data by groups in R如何在 R 中按组汇总日期数据
【发布时间】:2013-12-19 20:47:32
【问题描述】:

我想将以下示例数据汇总到一个新的数据框中,如下所示:

人口、样本量 (N)、完成百分比 (%)

样本大小是每个总体的所有记录的计数。我可以使用 table 命令或 tapply 来做到这一点。完成百分比是具有“结束日期”的记录的百分比(假设所有没有“结束日期”的记录都未完成。这就是我迷路的地方!

样本数据

 sample <- structure(list(Population = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L), .Label = c("Glommen", 
    "Kaseberga", "Steninge"), class = "factor"), Start_Date = structure(c(16032, 
    16032, 16032, 16032, 16032, 16036, 16036, 16036, 16037, 16038, 
    16038, 16039, 16039, 16039, 16039, 16039, 16039, 16041, 16041, 
    16041, 16041, 16041, 16041, 16044, 16044, 16045, 16045, 16045, 
    16045, 16048, 16048, 16048, 16048, 16048, 16048), class = "Date"), 
        End_Date = structure(c(NA, 16037, NA, NA, 16036, 16043, 16040, 
        16041, 16042, 16042, 16042, 16043, 16043, 16043, 16043, 16043, 
        16043, 16045, 16045, 16045, 16045, 16045, NA, 16048, 16048, 
        16049, 16049, NA, NA, 16052, 16052, 16052, 16052, 16052, 
        16052), class = "Date")), .Names = c("Population", "Start_Date", 
    "End_Date"), row.names = c(NA, 35L), class = "data.frame")

【问题讨论】:

    标签: r summary tapply group-summaries


    【解决方案1】:

    您可以使用拆分/应用/组合来做到这一点:

    spl = split(sample, sample$Population)
    new.rows = lapply(spl, function(x) data.frame(Population=x$Population[1],
                                                  SampleSize=nrow(x),
                                                  PctComplete=sum(!is.na(x$End_Date))/nrow(x)))
    combined = do.call(rbind, new.rows)
    combined
    
    #           Population SampleSize PctComplete
    # Glommen      Glommen         13   0.6923077
    # Kaseberga  Kaseberga          7   1.0000000
    # Steninge    Steninge         15   0.8666667
    

    警告一句:sample 是基本函数的名称,因此您应该为数据框选择一个不同的名称。

    【讨论】:

    • 抱歉数据框名称。我试图保持简单。我很欣赏使用基本功能的解决方案。我遇到了一个更复杂的问题,您的解决方案帮助我解决了问题。
    【解决方案2】:

    使用plyr 包很容易:

    library(plyr)
    ddply(sample, .(Population), summarize, 
          Sample_Size = length(End_Date),
          Percent_Completed = mean(!is.na(End_Date)) * 100)
    
    #   Population Sample_Size Percent_Completed
    # 1    Glommen          13          69.23077
    # 2  Kaseberga           7         100.00000
    # 3   Steninge          15          86.66667
    

    【讨论】:

    • 这是一个非常好的解决方案。我只投票支持拆分/应用/组合解决方案,因为我喜欢使用基本包学习 R。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2022-01-07
    • 2021-03-09
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多