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