【问题标题】:Fastest way to loop through columns and calculate IQR by group, then calculate proportion IQR for each group based on reference group?循环列并按组计算IQR的最快方法,然后根据参考组计算每个组的比例IQR?
【发布时间】:2019-07-12 16:24:35
【问题描述】:

我有一个看起来像这样的大型数据集(大约 12,000 列)

    > df
    ID Group val1 val2 val3
    1 01     a    3    3    3
    2 02     a    4    4    4
    3 03     b    6    6    7
    4 04     c   10   10   19
    5 05     b    2    2    2
    6 06     b    4    4    4
    7 07     c    8    8    8
    8 08     c   12   12   12
  1. 遍历每一列并为每个组获取一个 IQR。

  2. 然后为每组的每一列计算一个 deltaIQR...

    例如

    B 的 delta IQR = (B 组的 IQR - A 组的 IQR)/A 组的 IQR

    C 的 delta IQR = (C 组的 IQR - A 组的 IQR) / A 组的 IQR

最有效的方法是什么?

我尝试按 Group 解决方案进行 dplyr 汇总,但 df 太大。而且我还需要先计算分位数,等等。所以它变得更加笨拙......

之前使用 dplyr 解决方案会带来一些错误

df %>%
  group_by(Group) %>%
  summarise_at(vars(matches('val')), IQR) %>% 
  rename_at(-1, ~ paste0(., "_IQR")) %>% 
  mutate_at(vars(matches('val')), list(delta= ~ (. - .[1])/.[1]))

在我的实际数据集中

> temp
  v6599_IQR v6599_IQR_delta v1554_IQR v1554_IQR_delta
1   0.00191803       0.000000e+00  0.001794153       0.000000e+00
2   0.62698976       3.258926e+02  1.722508234       9.590677e+02
3   0.00191803       7.235440e-15  0.001794153       4.641005e-14
4   0.00191803      -3.617720e-14  2.155928869       1.200642e+03

现在似乎有错误,因为当我计算 3 和 4 的 deltaIQR 时...计算已关闭,对于第一列,第 3 行和第 4 行的 delta IQR 应该为 0。

【问题讨论】:

  • 你能分享dput(head(yourdata,10)的输出吗?
  • 数据量很大,但我已经向您展示了 2 列的输出,对于 IQR 和 deltaIQR,第 1-4 行是单独的组
  • 我向您展示的语法,仅共享 10 行,因此数据大小无关紧要。
  • 你是指我的输入数据还是 dplyr 的输出(见编辑后的帖子)
  • 您想知道为什么增量 IQR 是 7.235440e-15 和 -3.617720e-14 而不是 0.000000e+00?这是由于浮点运算导致的,在here: Why are these numbers not equal? 中有详细解释

标签: r loops


【解决方案1】:

更新:

要计算deltaIQR,我使用的是dplyr

library(dplyr)

df %>%
  group_by(Group) %>%
  summarise_at(vars(matches('val')), IQR) %>% 
  rename_at(-1, ~ paste0(., "_IQR")) %>% 
  mutate_at(vars(matches('val')), list(delta= ~ (. - .[1])/.[1]))

#> # A tibble: 3 x 7
#>   Group val1_IQR val2_IQR val3_IQR val1_IQR_delta val2_IQR_delta val3_deltaIQR
#>   <fct>    <dbl>    <dbl>    <dbl>          <dbl>          <dbl>         <dbl>
#> 1 a          0.5      0.5      0.5              0              0             0
#> 2 b          2        2        2.5              3              3             4
#> 3 c          2        2        5.5              3              3            10

Thanks to akrun for his comment on dplyr solution


通过列循环计算IQR可以在base中完成:

sapply(df[,3:5], function(x) tapply(x, df$Group, IQR))

#>   val1 val2 val3
#> a  0.5  0.5  0.5
#> b  2.0  2.0  2.5
#> c  2.0  2.0  5.5

数据:

df <- read.table(text="ID Group val1 val2 val3
                       01     a    3    3    3
                       02     a    4    4    4
                       03     b    6    6    7
                       04     c   10   10   19
                       05     b    2    2    2
                       06     b    4    4    4
                       07     c    8    8    8
                       08     c   12   12   12", header=T)

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2016-02-09
    • 2019-01-27
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多