最快的方法是遍历列并按组计算IQR,然后根据参考组计算各组的比例IQR?

时间:2019-07-12 16:24:35

标签: r loops

我有一个看起来像这样的大数据集(约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 ...

For example 

delta IQR of B = ( IQR of group B - IQR of Group A) / IQR of Group A 

delta IQR of C = (IQR of group C - IQR of Group A) / IQR of Group A

最有效的方法是什么?

我尝试按组解决方案汇总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。

1 个答案:

答案 0 :(得分: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)