【问题标题】:Grouping values into quantiles based on their % value and visualize in R?根据百分比值将值分组为分位数并在 R 中可视化?
【发布时间】:2021-01-11 04:09:00
【问题描述】:

我有 2 个字段的 % 值显示字段 A 中的字符串与字段 B 的对齐方式,使用模糊匹配方法并将该距离值除以字段 A 的长度。

例子:

  R_Number                     A                     B distance len_A len_B  A_percent  B_percent
1      ABC             Microsoft             Microsoft        0     9     9 0.00000000 0.00000000
2      CBD Microsoft Corporation         Microsoft INC       11    21    13 0.52380952 0.84615385
3      DDV        Microsoft Corp        Microsoft corp        1    14    14 0.07142857 0.07142857
4      ABC         Microsoft inc             Microsoft        4    13     9 0.30769231 0.44444444
5      CBD             Microsoft Microsoft Corporation       12     9    21 1.33333333 0.57142857
6      DDV         Microsoft INC        Microsoft Corp        4    13    14 0.30769231 0.28571429

我想做的是根据 A_percent 和 B_percent 中的 % 值将 R_Number 分组为 0.25、0.5、0.75 和 1 的分位数,形成图表/和/或表格。

我想要的输出看起来像这样,其中每个分位数显示落在每个分位数区域中的值的百分比:

 R_Number `25%`  `50%` `75%` `100%`
  <chr>    <dbl>  <dbl> <dbl>  <dbl>
1 ABC      0.143 0.286  0.297  0.308
2 CBD      0.706 0.889  1.11   1.33 
3 DDV      0     0.0357 0.130  0.308

任何帮助都会很棒 - 对 R 来说是新的。

【问题讨论】:

    标签: r dplyr purrr quantile


    【解决方案1】:

    这种操作可以用tidyverse函数来处理。

    library(tidyverse)
    
    # dummy data
    DF <- tibble(R_value = rep(LETTERS[1:3], each=3),
                 A_percent = runif(9))
    DF
    # A tibble: 9 x 2
    #  R_value A_percent
    #  <chr>       <dbl>
    #1 A           0.965
    #2 A           0.926
    #3 A           0.835
    #4 B           0.361
    #5 B           1.00 
    #6 B           0.366
    #7 C           0.153
    #8 C           0.917
    #9 C           0.307
    

    首先我们要找到A_percent 的每个值的分位数。我们可以为此使用cut()。我不确定您想如何将B_percentA_percent 一起包含在内。

    DF %>%
      mutate(A_quantile = cut(A_percent,
                              breaks = c(0,.25,.5,.75,1),
                              labels = c("25%","50%","75%","100%")))
    

    然后我们要从每个分位数中的每个 R_number 计算行数。

    DF %>%
      mutate(A_quantile = cut(A_percent,
                              breaks = c(0,.25,.5,.75,1),
                              labels = c("25%","50%","75%","100%"))) %>%
      group_by(R_value, A_quantile) %>%
      summarize(n = n())
    

    最后我们可以把它做成一个宽数据框,将分位数作为单独的列。

    DF %>%
      mutate(A_quantile = cut(A_percent,
                              breaks = c(0,.25,.5,.75,1),
                              labels = c("25%","50%","75%","100%"))) %>%
      group_by(R_value, A_quantile) %>%
      summarize(n = n()) %>%
      pivot_wider(names_from=A_quantile,
                  values_from=n,
                  values_fill=0)
    # A tibble: 3 x 4
    # Groups:   R_value [3]
    #  R_value `100%` `50%` `25%`
    #  <chr>    <int> <int> <int>
    #1 A            3     0     0
    #2 B            1     2     0
    #3 C            1     1     1
    

    【讨论】:

    • 这真的很有帮助 - 谢谢!我无法使用最后一个 df 分位数表按顺序组织列。我的输出没有让列按从高到低的顺序排列@Alexlok
    • 你可以使用pivot_wider()names_sort = TRUE参数。
    • 这非常有帮助,我接受了它——但有没有办法把它制定成一个函数,这样我就可以输入选择的字段并输出表格? @Alexlok
    • 是的,但是有一个技巧可以传递列的名称。看到这个小插曲:dplyr.tidyverse.org/articles/programming.html
    • 我无法将您最后的代码转换为函数@Alexlok 当我调用各个字段时,我似乎无法包含 group by 并对其进行汇总。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多