根据其他列定义的子集计算多列的指标

Calculate metrics for multiple columns based on subsets defined by other columns

我想为数据框中某些列的子集计算简单的摘要指标,其中这些子集基于同一数据框中其他列中的信息。让我举例说明:

colA <- c(NA,2,3,NA,NA,3,9,5,6,1)
colB <- c(9,3,NA,2,2,4,6,1,9,9)
colC <- c(NA,NA,5,7,3,9,8,1,2,3)
colAA <- c(NA,NA,6,NA,NA,NA,1,7,9,4)
colBB <- c(NA,2,NA,7,8,NA,2,7,9,4)
colCC <- c(NA,NA,3,7,5,8,9,9,NA,3)

df <- data.frame(colA,colB,colC,colAA,colBB,colCC)

> df
   colA colB colC colAA colBB colCC
1    NA    9   NA    NA    NA    NA
2     2    3   NA    NA     2    NA
3     3   NA    5     6    NA     3
4    NA    2    7    NA     7     7
5    NA    2    3    NA     8     5
6     3    4    9    NA    NA     8
7     9    6    8     1     2     9
8     5    1    1     7     7     9
9     6    9    2     9     9    NA
10    1    9    3     4     4     3

此处 colAA 应由 colA 子集化,以便删除 colA 中包含 NA 的行:

> df1 <- subset(df, !is.na(colA))
> df1
   colA colB colC colAA colBB colCC
2     2    3   NA    NA     2    NA
3     3   NA    5     6    NA     3
6     3    4    9    NA    NA     8
7     9    6    8     1     2     9
8     5    1    1     7     7     9
9     6    9    2     9     9    NA
10    1    9    3     4     4     3

现在我想计算例如列长度​​和列中非 NA 值的百分比:

> length(df1$colAA)
[1] 7
> (nrow(subset(df1, !is.na(colAA)))/length(df1$colAA))*100
[1] 71.42857

在理想情况下,输出将写入另一个数据框,例如:

cat n perc_n
1 colAA 7     71
2 colBB 9     78
3 colCC 8     88

有什么方法可以以稍微 elegant/efficient 的方式对所有列实现此目的吗?任何建议将不胜感激!

您可以将两组列传递给Map:

res = Map(function(x,y) summary(y[!is.na(x)]), df[,1:3], df[, 4:6])

由于 post 被标记为 data.table,我还建议制作一个 table,例如

data.table::rbindlist(lapply(res, as.list), id="col")

#     col Min. 1st Qu. Median  Mean 3rd Qu. Max. NA's
# 1: colA    1       4      6 5.400     7.0    9    2
# 2: colB    2       3      7 5.571     7.5    9    2
# 3: colC    3       4      7 6.286     8.5    9    1

您可以将 summary 替换为任何您喜欢的函数 returns 一个命名向量,它仍然可以与 as.list + rbindlist.

一起使用