【问题标题】:Creating a new dataframe based on statistics calculated from a previous data frame根据从先前数据帧计算的统计信息创建新数据帧
【发布时间】:2020-04-06 18:57:12
【问题描述】:

我有以下数据框

dat <- data.frame(ID = c(1, 1, 1, 2, 2, 2),
                   A = c(50, 150, 200, 250, 100, NA),
                   B = c(10, NA, 30, NA, NA, 10))

我想创建一个新的数据框,告诉我不是 NA 的点的百分比,这样

   dat2 <- data.frame(ID = c(1, 2),
                        A =c( 100, 66.6),
                        B = c(66.6, 33.3))

我知道如何计算 R 中的值,但我不知道如何将计算放入新的数据框中。

【问题讨论】:

    标签: r dataframe calculation


    【解决方案1】:

    我们可以通过'ID'和非NA逻辑向量的mean进行分组

    library(dplyr)
    dat %>% 
       group_by(ID) %>% 
       summarise_all(~ 100 *mean(!is.na(.)))
    # A tibble: 2 x 3
    #     ID     A     B
    #  <dbl> <dbl> <dbl>
    #1     1 100    66.7
    #2     2  66.7  33.3
    

    或者使用来自base R的aggregate

    aggregate(. ~ ID, dat, FUN = function(x) 100 *mean(!is.na(x)), na.action  = NULL)
    

    【讨论】:

      【解决方案2】:

      使用data.table,您可以非常高效地做到这一点:

      library(data.table)
      setDT(data)
      dat[,.(lapply(.SD, function(x) 100*mean(!is.na(x))), by = "ID"]
      

      .SD 表示数据子集您将mean + is.na 组合应用于所有列。您还可以使用 .SDcols 将其应用于列的子集(例如 A 列):

      dat[,.(lapply(.SD, function(x) 100*mean(!is.na(x))),
            by = "ID", .SDcols = c("A")]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多