r-基于从以前的数据帧计算的统计信息创建新的数据帧



我有以下数据帧

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

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

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

最新更新