按较大的组(R)排序数据帧
我想按组的“和”对数据帧进行排序。所以,我不希望数据帧按组排序,而是按组的总量排序。也就是说,我想知道哪一组是最大的,1、2或3,然后根据该值排序。所以,假设第三组是最大的组,那么我希望第三组在顶部,我希望第三组的值按降序排列按较大的组(R)排序数据帧,r,sorting,dplyr,R,Sorting,Dplyr,我想按组的“和”对数据帧进行排序。所以,我不希望数据帧按组排序,而是按组的总量排序。也就是说,我想知道哪一组是最大的,1、2或3,然后根据该值排序。所以,假设第三组是最大的组,那么我希望第三组在顶部,我希望第三组的值按降序排列 set.seed(123) d <- data.frame( x = runif(90), grp = gl(3, 30)) set.seed(123) d使用dplyr的一种方法是 d %>% group_by(grp) %>%
set.seed(123)
d <- data.frame(
x = runif(90),
grp = gl(3, 30))
set.seed(123)
d使用dplyr的一种方法是
d %>%
group_by(grp) %>%
mutate(sum_ = sum(x)) %>%
arrange(desc(sum_), desc(x)) %>%
select(-sum_)
基本上,我们创建一个临时变量sum
,它按组指示x
的和,然后按照sum
第一个和x
第二个排列。之后,我们删除了sum
,因为它不再需要了
输出
# A tibble: 90 x 2
# Groups: grp [3]
# x grp
# <dbl> <fct>
# 1 0.994 1
# 2 0.957 1
# 3 0.955 1
# 4 0.940 1
# 5 0.900 1
# 6 0.892 1
# 7 0.890 1
# 8 0.883 1
# 9 0.788 1
# 10 0.709 1
# ... with 80 more rows
#一个tible:90 x 2
#组别:grp[3]
#玻璃钢
#
# 1 0.994 1
# 2 0.957 1
# 3 0.955 1
# 4 0.940 1
# 5 0.900 1
# 6 0.892 1
# 7 0.890 1
# 8 0.883 1
# 9 0.788 1
# 10 0.709 1
# ... 还有80多行
另一个选项是根据x
的总和重新排列grp
的级别。这可以用tidyverse
完成,如下所示:
库(tidyverse)
种子集(123)
df%
变异(
grp=fct\u重新排序(grp,x,.fun=“sum”,.desc=TRUE)
) %>%
排列(grp)
#>#tibble:90 x 2
#>玻璃钢
#>
#> 1 0.288 1
#> 2 0.788 1
#> 3 0.409 1
#> 4 0.883 1
#> 5 0.940 1
#> 6 0.0456 1
#> 7 0.528 1
#> 8 0.892 1
#> 9 0.551 1
#> 10 0.457 1
#>#…还有80行
df%>%
分组依据(grp)%>%
总结(总计=总和(x))
#>#tibble:3 x 2
#>玻璃钢总吨
#>
#> 1 1 17.2
#> 2 2 13.2
#> 3 3 15.4
由(v0.3.0)于2020年6月17日创建,您可以首先在base中使用order
,然后按grp和rbind
按rowsum
的顺序进行拆分
d <- d[order(-d$x),]
do.call(rbind, split(d, d$grp)[order(-rowsum(d$x, d$grp))])
# x grp
#1.24 0.9942697766 1
#1.11 0.9568333453 1
#1.20 0.9545036491 1
#1.5 0.9404672843 1
#1.16 0.8998249704 1
#1.8 0.8924190444 1
#1.21 0.8895393161 1
#1.4 0.8830174040 1
#1.2 0.7883051354 1
#1.26 0.7085304682 1
#1.22 0.6928034062 1
#1.13 0.6775706355 1
#1.25 0.6557057991 1
#1.23 0.6405068138 1
#1.28 0.5941420204 1
#1.14 0.5726334020 1
#1.9 0.5514350145 1
#1.27 0.5440660247 1
#1.7 0.5281054880 1
#1.10 0.4566147353 1
#1.12 0.4533341562 1
#1.3 0.4089769218 1
#1.19 0.3279207193 1
#1.29 0.2891597373 1
#1.1 0.2875775201 1
#1.17 0.2460877344 1
#1.30 0.1471136473 1
#1.15 0.1029246827 1
#1.6 0.0455564994 1
#1.18 0.0420595335 1
#3.87 0.9849569800 3
#3.88 0.8930511144 3
#3.89 0.8864690608 3
#3.65 0.8146400389 3
#3.68 0.8123895095 3
#3.67 0.8100643530 3
#3.69 0.7943423211 3
#3.84 0.7881958340 3
#3.71 0.7544751586 3
#3.73 0.7101824014 3
#3.82 0.6680555874 3
#3.61 0.6651151946 3
#3.72 0.6292211316 3
#3.78 0.6127710033 3
#3.75 0.4753165741 3
#3.66 0.4485163414 3
#3.70 0.4398316876 3
#3.86 0.4348927415 3
#3.83 0.4176467797 3
#3.63 0.3839696378 3
#3.77 0.3798165377 3
#3.79 0.3517979092 3
#3.64 0.2743836446 3
#3.81 0.2436194727 3
#3.76 0.2201188852 3
#3.90 0.1750526503 3
#3.80 0.1111354243 3
#3.85 0.1028646443 3
#3.62 0.0948406609 3
#3.74 0.0006247733 3
#2.31 0.9630242325 2
#2.32 0.9022990451 2
#2.59 0.8950453592 2
#2.50 0.8578277153 2
#2.53 0.7989248456 2
#2.34 0.7954674177 2
#2.37 0.7584595375 2
#2.58 0.7533078643 2
#2.33 0.6907052784 2
#2.55 0.5609479838 2
#2.36 0.4777959711 2
#2.48 0.4659624503 2
#2.52 0.4422000742 2
#2.42 0.4145463358 2
#2.43 0.4137243263 2
#2.60 0.3744627759 2
#2.44 0.3688454509 2
#2.39 0.3181810076 2
#2.49 0.2659726404 2
#2.47 0.2330340995 2
#2.40 0.2316257854 2
#2.38 0.2164079358 2
#2.56 0.2065313896 2
#2.45 0.1524447477 2
#2.41 0.1428000224 2
#2.46 0.1388060634 2
#2.57 0.1275316502 2
#2.54 0.1218992600 2
#2.51 0.0458311667 2
#2.35 0.0246136845 2
d$grp <- factor(d$grp, levels(d$grp)[order(-rowsum(d$x, d$grp))])
d[order(d$grp, -d$x),]