【问题标题】:Writing a function to filter and summarize data into proportion table编写函数将数据过滤汇总成比例表
【发布时间】:2019-11-13 09:19:20
【问题描述】:

我想创建一个大比例表,包括根据一列过滤掉某些值,并输出表中等于 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
...

由此,我想得出 b=0 或 b>0 IF 列 a>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

【问题讨论】:

    标签: r filter summarize


    【解决方案1】:

    我们对备用列进行子集化,将每个集合用作 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"))
    

    【讨论】:

    • 我给你的数据框只是一个更大的数据集(大约 50 个变量)的一部分——我如何调整这个脚本来从更大的数据集中提取特定的列(除了选择和创建一个新的,更小的数据框)?
    • @Kayla 假设您有 50 列,感兴趣的列是前 20 列,然后使用 df1 &lt;- df[, 1:25] 并将代码应用于子集数据集
    • 好的-只用一个子集(基本上是我之前介绍的,所以总共 6 列)尝试这个,我遇到了这个错误:错误:[ 的逻辑索引向量的长度必须列数相等(或 1):* .data 有 6 列 * 索引向量的长度为 2
    • 对不起-我让它工作了。当我创建一个新的更小的数据框时,问题在于选择函数(dplyr 与 plyr)。成功了,谢谢!
    • 很抱歉发现了问题 - 顺序略有不同。再次感谢您的所有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多