我在两个场景中遇到了类似的问题。
场景1:具有相同列名的数据框,其中两个组没有特定顺序。 ALL |全部| AML |全部| AML | AML | AML | ALL
方案2:具有数字后缀的数据框列名。 ALL,ALL.1,ALL.2,AML.1,AML.2,......这也有两位数字。如果我按升序排序,它将变为ALL.1,ALL.10,ALL.11
我希望首先对所有ALL进行分组,然后对AML进行分组。如何在两种情况下实现这一目标?
答案 0 :(得分:2)
解决此问题的一种方法,
y <- c('ALL', 'ALL.1', 'ALL.2', 'AML.1', 'AML.2', 'ALL.10')
y[order(gsub('\\.\\d+', '', y))]
#[1] "ALL" "ALL.1" "ALL.2" "ALL.10" "AML.1" "AML.2"
#or to use it in a data frame,
df[,order(gsub('\\.\\d+', '', names(df))))]
此外,您可以使用mixedorder
套餐中的gtools
,但您必须从后缀中替换.
,以便它不会将其视为十进制(意味着.10&lt; ; .2而不是10> 2),即
library(gtools)
#with the . in suffix
mixedsort(y)
#[1] "ALL.1" "ALL.10" "ALL.2" "ALL" "AML.1" "AML.2"
#without the . in suffix
mixedsort(gsub('\\.', '_', y))
#[1] "ALL" "ALL_1" "ALL_2" "ALL_10" "AML_1" "AML_2"
#or use it on the data frame
df[,mixedorder(gsub('\\.', '_', names (df)]
关于你的第一个案例,我同意@alistaire的名字需要是独一无二的。使用make.unique
并按照上述方法