编写函数以过滤数据并将其汇总到比例表中

时间:2019-07-02 17:18:33

标签: r filter summarize

我想创建一个大比例表,其中涉及根据一列过滤掉某些值,并输出表中等于0和大于0的值的比例。这是数据帧(df)的示例:

     ID   a   b   c   d   e   f   g
1     1   1   2   3   0   4   5   A 
2     2   0   0   1   0   2   0   A
3     3   1   5   2   1   0   0   B
4     4   5   1   2   0   1   1   B
5     5   2   0   1   0   0   0   C
...

据此,我想得出a = 0时b = 0或b> 0的比例。供您参考,我可以通过以下代码获取此信息:

prop.table(table(df$b[df$a>0]!=0))*100

但是,我想对列c和d以及e和f(相同的模式)执行相同的操作,以便在c = 0和e = 0时过滤掉那些> 0和= d和f的比例分别为0)。另外,我希望将所有输​​出都放在一个表中。可能看起来像这样:

      b.perc   d.perc   f.perc
TRUE   75.00    20.00    66.67
FALSE  25.00    80.00    33.33

感谢您的帮助。另外,我想计算G列中列出的各组的TRUE百分比,这样的输出如下:

      b.perc   d.perc   f.perc
A     100.00    0.00     50.00
B     100.00   50.00    100.00
C     0.00      0.00      0.00

1 个答案:

答案 0 :(得分:2)

我们将备用列作为子集,将每个集合用作mapply的输入,并根据OP帖子中提到的条件获取tableprop.table

out <- round(mapply(function(x, y) prop.table(table(x[y > 0] != 0)) * 100,
          df[c(FALSE, TRUE)], df[c(TRUE, FALSE)]), 2)
colnames(out) <- paste0(colnames(out), ".perc")
out
#      b.perc d.perc f.perc
#FALSE     25     80  33.33
#TRUE      75     20  66.67

如果我们只对TRUE百分比感兴趣,那么我们也可以使用colMeans来做到这一点

colMeans((df[c(FALSE, TRUE)] * NA^!(df[c(TRUE, FALSE)] > 0)) != 0, na.rm = TRUE)
#       b         d         f 
#0.7500000 0.2000000 0.6666667 

数据

df <- structure(list(a = c(1L, 0L, 1L, 5L, 2L), b = c(2L, 0L, 5L, 1L, 
0L), c = c(3L, 1L, 2L, 2L, 1L), d = c(0L, 0L, 1L, 0L, 0L), e = c(4L, 
2L, 0L, 1L, 0L), f = c(5L, 0L, 0L, 1L, 0L)), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5"))