【问题标题】:R get frequency distribution by a categorical or factor columnR通过分类或因子列获取频率分布
【发布时间】:2017-11-24 23:58:01
【问题描述】:

我有如下数据。如果我想找到频率分布,那么我可以使用下面的 hist 命令并使用 histz$breakshistz$counts 查找每个范围内的观察数。

我想按 a 列中的值获取 b 列的分布。我的 a 列将有 6 个不同的值。

我的预期输出是一个数据框

  • 第 1 列 - 中断值
  • 第 2 列 - 当试验的第 1 列值为 a 时,计数为 位于中断值定义的范围内的值
  • 第 3 列 - 当试验的第一列具有值 b 时,计数 位于中断值定义的范围内的值
  • 第 4 到第 7 列 - 与前面 2 列的逻辑相似

我的数据

a=c("a","a","b","a","b","b","c","a")

b=c(1,3,4,3,5,7,8,9)

trial=data.frame(a,b)

histz=hist(trial$b, breaks=c(0,4,6,100),plot=FALSE)

histz

【问题讨论】:

    标签: r frequency categorical-data frequency-distribution


    【解决方案1】:

    您可以使用cut()b 进行分类,然后使用table() 获得每个范围内的分布。在你的例子中

    tab = table(cut(trial$b,breaks=c(0,4,6,100)),trial$a)
    

    生产

              a b c
      (0,4]   3 1 0
      (4,6]   0 1 0
      (6,100] 1 1 1
    

    如果你想要比例,你可以使用

    ptab = prop.table(tab,margin=2)
    

    用于格式化 2 位数字

    rtab = round(ptab,2)
    

    导致

                 a    b    c
      (0,4]   0.75 0.33 0.00
      (4,6]   0.00 0.33 0.00
      (6,100] 0.25 0.33 1.00
    

    最后,如果要转换 do percent,请使用 formattable

    library(formattable)
    prtab = apply(rtab,1:2,percent,digits=0)
    
              a     b     c     
      (0,4]   "75%" "33%" "0%"  
      (4,6]   "0%"  "33%" "0%"  
      (6,100] "25%" "33%" "100%"
    

    您可以使用digits 参数控制精度。

    【讨论】:

    • 有没有办法将值的百分比舍入到小数点后的第二位而不是计数?我想要占列总数的百分比...所以对于 a 我想要的列 (75%,0%,25%)
    • 添加了如何在答案中获得百分比。
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2019-06-27
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多