根据从先前数据框计算的统计数据创建新数据框

Creating a new dataframe based on statistics calculated from a previous data frame

我有以下数据框

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 中的值,但我不知道如何将计算结果放入新的数据框中。

我们可以通过 '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)

使用 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")]