我有以下数据帧
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")]