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

时间:2018-07-18 15:08:01

标签: r data.table percentage na summary

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

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

以一种稍微优雅/有效的方式为所有列实现此目标的任何方法?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

您可以将两组列传递给Map

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

由于该帖子被data.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替换为您喜欢的任何返回命名向量的函数,并且仍然可以与as.list + rbindlist一起使用。