我有一个数据集,我想以某种方式排序,我需要它按
CENTER
进行分组
但除此之外,记录必须保持与原始数据集相同的排序顺序。所以 VUMC 是第一,KUL 是第二,所以应该保持相同的顺序。
诚然,我在 R 方面没有那么丰富的经验,但在 SQL(我在这里不能使用)中,我只需执行
DENSE_RANK
即可获得所需的结果。在 R 中,有一个基本的 rank
函数,dplyr 库有一个 dense_rank
函数,但由于某种原因我无法让它工作。
这是我尝试过的代码
df_results <- read.table(text = "
CENTER;FILE;HB;LineNr
VUMC;NPUT_00172.MRC;12.7;1
VUMC;PHYM_00577.MRC;11.9;2
VUMC;CPNU_00625.MRC;9.2;3
KUL;UYTC_00146.MRC;10.8;4
KUL;UKFA_00766.MRC;10.7;5
LOR;RFAF_00105.MRC;12.9;6
LOR;ARFW_00961.MRC;12.4;7
KUL;HMCU_00630.MRC;8.6;8
VUMC;FPRB_00509.MRC;10.8;9
LOR;TWUA_00651.MRC;10.6;10
", header = TRUE, sep = ";", na.strings = "")
library(dplyr)
df_results <- df_results %>%
group_by(CENTER) %>%
mutate(min_LineNr = min(LineNr),
dense_linenr = rank(min_LineNr),
NewSortOrder = (dense_linenr*1000 + LineNr) )
min(LineNr)
部分按预期工作,但rank
导致2.0
和2.5
,我无法完全解释。
我也尝试过将 mutate(rank..)
作为单独的声明,但这没有任何区别。
我也尝试过 dense_rank
,这只会导致新专栏的所有 1
,这又不是我所期望的。
中心 | 文件 | HB | 线路编号 | min_LineNr | dense_linenr | 新排序顺序 |
---|---|---|---|---|---|---|
VUMC | NPUT_00172.MRC | 12.7 | 1 | 1 | 2.5 | 2501 |
VUMC | PHYM_00577.MRC | 11.9 | 2 | 1 | 2.5 | 2502 |
VUMC | CPNU_00625.MRC | 9.2 | 3 | 1 | 2.5 | 2503 |
库尔 | UYTC_00146.MRC | 10.8 | 4 | 4 | 2 | 2004年 |
库尔 | UKFA_00766.MRC | 10.7 | 5 | 4 | 2 | 2005 |
劳尔 | RFAF_00105.MRC | 12.9 | 6 | 6 | 2 | 2006年 |
劳尔 | ARFW_00961.MRC | 12.4 | 7 | 6 | 2 | 2007年 |
库尔 | HMCU_00630.MRC | 8.6 | 8 | 4 | 2 | 2008 |
VUMC | FPRB_00509.MRC | 10.8 | 9 | 1 | 2.5 | 2509 |
劳尔 | TWUA_00651.MRC | 10.6 | 10 | 6 | 2 | 2010 |
理想的结果应如下表所示,因此 NewSortOrder 包含按
CENTER
分组的排序顺序,但在这些中心内,它按原始行顺序排序。
中心 | 文件 | HB | 线路编号 | 新排序顺序 |
---|---|---|---|---|
VUMC | NPUT_00172.MRC | 12.7 | 1 | 1001 |
VUMC | PHYM_00577.MRC | 11.9 | 2 | 1002 |
VUMC | CPNU_00625.MRC | 9.2 | 3 | 1003 |
VUMC | FPRB_00509.MRC | 10.8 | 9 | 1004 |
库尔 | UYTC_00146.MRC | 10.8 | 4 | 2001 |
库尔 | UKFA_00766.MRC | 10.7 | 5 | 2002 |
库尔 | HMCU_00630.MRC | 8.6 | 8 | 2003 |
劳尔 | RFAF_00105.MRC | 12.9 | 6 | 3001 |
劳尔 | ARFW_00961.MRC | 12.4 | 7 | 3002 |
劳尔 | TWUA_00651.MRC | 10.6 | 10 | 3003 |
我的问题是: 为什么
rank
和 dense_rank
会给出这些奇怪的结果?可以这么说,为什么它不按照罐头上所说的那样做呢?
哪种 R 代码或库是获得所需结果列的最直接方法?
arrange()
将是对 data.frame 的行进行排序的所需方法。它按字母顺序排列文本值,但您可以通过将列更改为具有按自然顺序排列的级别的因子来更改此行为,如下所示:
df_results %>%
arrange(factor(CENTER,levels=unique(CENTER)))
产品:
CENTER FILE HB LineNr
1 VUMC NPUT_00172.MRC 12.7 1
2 VUMC PHYM_00577.MRC 11.9 2
3 VUMC CPNU_00625.MRC 9.2 3
4 VUMC FPRB_00509.MRC 10.8 9
5 KUL UYTC_00146.MRC 10.8 4
6 KUL UKFA_00766.MRC 10.7 5
7 KUL HMCU_00630.MRC 8.6 8
8 LOR RFAF_00105.MRC 12.9 6
9 LOR ARFW_00961.MRC 12.4 7
10 LOR TWUA_00651.MRC 10.6 10