2017-04-22 139 views
0

我在两种情况下有类似的问题。重新排序列名

情况1:具有相同列名的数据框与两个没有特定顺序的组。 全部|全部|反洗钱|全部|反洗钱|反洗钱|反洗钱|全部

场景2:带有数字后缀的数据帧列名。 ALL,ALL.1,ALL.2,AML.1,AML.2,...这也有两位数的数字。如果我按升序排列,就变成ALL.1,ALL.10,ALL.11

我希望先将所有ALLs分组,然后将AML分组。我如何在两种情况下实现这一目标?解决这个

+0

不唯一的名称在data.frame中几乎没有用处。在做任何事情之前最好调用'make.unique'。全部告诉,也许'图书馆(呜呜声); names(df)< - make.unique(names(df)); ord < - names(df)%>%strsplit('\\。')%>%map_df(〜list(V1 = .x [1],V2 = as.integer(.x [2])))%> %invoke(order,。,na.last = FALSE); df < - df [,ord]' – alistaire

+0

或者'library(tidyverse); ord < - data_frame(name = names(df))%>%separate(name,c('var','suf'),convert = TRUE,fill ='right')%>%invoke(order,。) – alistaire

回答

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))))] 

此外,您可以使用mixedordergtools包,但你必须从后缀更换.,所以它不会把它当作小数点(意为0.10 < .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并按照上述方法

+0

这取决于下标是按升序排列。如果它正好在'make.unique'之后,那是真的。 – alistaire

+0

@alistaire我假设尽可能多的数字后缀在colnames被放在那里自动从一些操作,所以他们将永远在递增的顺序 – Sotos

+0

非常感谢你们! @索托斯,你是对的,我试图使重复的列名称是唯一的,这就是我如何达到情景2,但不能完全弄清楚如何重新排序。 – Rav