根据从先前数据框计算的统计数据创建新数据框
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")]
我有以下数据框
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")]