2017-04-22 3 views
0

Ich habe ein ähnliches Problem in zwei Szenarien.Umsortieren von Spaltennamen

Szenario 1: Datenrahmen mit identischen Spaltennamen mit zwei Gruppen ohne besondere Reihenfolge. ALLE | ALLE | AML | ALLE | AML | AML | AML | ALLE

Szenario 2: Datenrahmenspaltennamen mit numerischen Suffixen. ALL, ALL.1, ALL.2, AML.1, AML.2, ... das hat auch zweistellige Zahlen. Wenn ich dies in aufsteigender Reihenfolge bestelle, wird es ALL.1, ALL.10, ALL.11

Ich möchte alle ALLs zuerst und die von AMLs gefolgt gruppieren. Wie kann ich dies in beiden Szenarien erreichen?

+0

Namen, die nicht eindeutig sind, sind in einem data.frame neben nutzlos. Am besten sollte man 'make.unique' nennen, bevor man etwas anderes macht. Alles in allem vielleicht "Bibliothek (purrr); Namen (df) <- make.unique (Namen (df)); ord <- Namen (df)%>% strsplit ('\\.')%>% map_df (~ Liste (V1 = .x [1], V2 = as.integer (.x [2])))%> % invoke (order,., na.last = FALSE); df <- df [, ord] ' – alistaire

+0

Oder vielleicht' Bibliothek (ordentlich); ord <- data_frame (name = namen (df))%>% seperate (name, c ('var', 'suff'), convert = TRUE, fill = 'right')%>% invoke (order,.) ' – alistaire

Antwort

2

Eine Möglichkeit, dies zu nähern,

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

Zusätzlich können Sie mixedorder von gtools Paket verwenden, aber Sie werden die . aus dem Suffix zu ersetzen, so dass es es als Dezimalzahl nicht behandeln (was bedeutet, .10 < 0,2 und nicht mehr als 10> 2), dh

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

Was Ihre erste Fall, ich stimme mit @alistaire, deren Namen eindeutig sein müssen. Verwenden Sie make.unique und folgen Sie der obigen Methode

+0

Dies hängt von den Indizes in aufsteigender Reihenfolge ab. Wenn es direkt nach "make.unique" ist, ist das wahr. – alistaire

+0

@alistaire Ich nehme an, so viel wie die numerischen Suffixe in colnames werden dort automatisch von einigen Betrieb gesetzt, so dass sie immer in aufsteigender Reihenfolge sein werden – Sotos

+0

Vielen Dank Jungs! @Sotos, du hast Recht, ich habe versucht, die doppelten Spaltennamen als einzigartig zu machen, so habe ich Szenario 2 erreicht, konnte aber nicht richtig herausfinden, wie ich neu anordnen soll. – Rav

Verwandte Themen