重新排序列名
问题描述:
我在两种情况下有类似的问题。重新排序列名
情况1:具有相同列名的数据框与两个没有特定顺序的组。 全部|全部|反洗钱|全部|反洗钱|反洗钱|反洗钱|全部
场景2:带有数字后缀的数据帧列名。 ALL,ALL.1,ALL.2,AML.1,AML.2,...这也有两位数的数字。如果我按升序排列,就变成ALL.1,ALL.10,ALL.11
我希望先将所有ALLs分组,然后将AML分组。我如何在两种情况下实现这一目标?解决这个
答
的一种方式,
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
包,但你必须从后缀更换.
,所以它不会把它当作小数点(意为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
并按照上述方法
不唯一的名称在data.frame中几乎没有用处。在做任何事情之前最好调用'make.unique'。全部告诉,也许'图书馆(呜呜声); names(df)%strsplit('\\。')%>%map_df(〜list(V1 = .x [1],V2 = as.integer(.x [2])))%> %invoke(order,。,na.last = FALSE); df alistaire
或者'library(tidyverse); ord %separate(name,c('var','suf'),convert = TRUE,fill ='right')%>%invoke(order,。) – alistaire