重新排序列名称

时间:2017-04-22 05:25:04

标签: r

我在两个场景中遇到了类似的问题。

场景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进行分组。如何在两种情况下实现这一目标?

1 个答案:

答案 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并按照上述方法