Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过列循环并按组计算IQR的最快方法,然后根据参考组计算每组的IQR比例?_R_Loops - Fatal编程技术网

通过列循环并按组计算IQR的最快方法,然后根据参考组计算每组的IQR比例?

通过列循环并按组计算IQR的最快方法,然后根据参考组计算每组的IQR比例?,r,loops,R,Loops,我有一个大的数据集(大约12000列),看起来像这样 > 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

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

    > 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
  • 循环遍历每个列,并获得每个组的IQR

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

    比如说

    B组的增量IQR=(B组的IQR-A组的IQR)/A组的IQR

    C组的增量IQR=(C组的IQR-A组的IQR)/A组的IQR

  • 最有效的方法是什么

    我试图通过小组解决方案进行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行的增量IQR应为0。

    更新: 要计算
    deltaIQR
    ,我使用的是
    dplyr

    库(dplyr)
    df%>%
    分组依据(分组)%>%
    在(VAR(匹配项('val'))、IQR%%>
    将_重命名为(-1,~0(,“_IQR”))%>%
    在(vars(matches('val'))、list(delta=~(.-[1])/[1])处进行变异
    #>#tibble:3 x 7
    #>组val1_IQR val2_IQR val3_IQR val1_IQR_delta val2_IQR_delta val3_deltaIQR
    #>                                            
    #>1 a 0.50.50.50 0
    #>2 b 2 2.5 3 4
    #>3 C2 5.5 3 3 10
    


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

    sappy(df[,3:5],函数(x)tapply(x,df$组,IQR))
    #>val1 val2 val3
    #>a 0.50.50.5
    #>b 2.0 2.0 2.5
    #>c 2.0 2.0 5.5
    
    数据:


    df你能分享
    dput(head(yourdata,10)
    )的输出吗?数据太多了,但我给你展示了两列的输出,对于IQR和deltaIQR,第1-4行是独立的组。我给你展示的语法只分享了10行,所以数据的大小无关紧要。你是指我的输入数据还是dplyr的输出(见编辑后文)你想知道为什么增量IQR是7.235440e-15和-3.617720e-14,而不是0.000000e+00吗?这是由于对浮点运算进行了深入解释