通过列循环并按组计算IQR的最快方法,然后根据参考组计算每组的IQR比例?
我有一个大的数据集(大约12000列),看起来像这样通过列循环并按组计算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
> 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
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吗?这是由于对浮点运算进行了深入解释