2017-11-08 2 views
1

Ich beobachte seltsame Verhaltensweisen bei der Bestellung eines Datenrahmens nach Spaltennamen. Wenn der Datenrahmen nur eine Spalte hat, verliert er bei der Sortierung grundsätzlich den Spaltennamen, was bei mehreren Spalten nicht der Fall ist. Dies ist ein Beispielcode:Bestellung eines Datenrahmens in R nach Spalten

df <- data.frame(c("1", "2", "3"), c("4", "5", "6"), c("7", "8", "9")) 
colnames(df) <- c("A", "C", "B") 
df <- data.frame(df[,order(colnames(df))]) 
print(colnames(df)) 


df <- data.frame(c("1", "2", "3")) 
colnames(df) <- c("A") 
df <- data.frame(df[,order(colnames(df))]) 
print(colnames(df)) 

Im ersten Teil des Codes, Datenrahmen df, bewahrt seine Spalten, aber im zweiten Teil verliert er die Spaltennamen.

Offensichtlich kann man nach der Anzahl der Spalten suchen und ihren Namen zurückholen, wenn es nur eine Spalte gibt, aber es klingt wie eine schlechte Übung.

Kennt jemand einen schöneren Weg, um das Problem zu behandeln?

+7

gut alt 'Drop' Problem. Verwenden Sie: 'data.frame (df [, order (Spaltennamen (df)), drop = F])' –

+4

Eine bessere Methode in diesem Fall ist die Verwendung der Listensyntax: 'df [order (Spaltennamen (df))]' behält die Listenstruktur (und die zugehörigen Namen), während 'df [order (Spaltennamen (df))]] die Listenstruktur in der Instanz einer einzelnen Spalte data.frame ablegt. – lmo

Antwort

0

können Sie tibble anstelle von data.frame:

library(tibble) 
df <- tibble(c("1", "2", "3"), c("4", "5", "6"), c("7", "8", "9")) 
colnames(df) <- c("A", "C", "B") 
df <- df[,order(colnames(df))] 
print(colnames(df)) 


df <- tibble(c("1", "2", "3")) 
colnames(df) <- c("A") 
df <- df[,order(colnames(df))] 
print(colnames(df)) 
+2

Warum sollte jemand ein Paket installieren und die Datenstruktur für solch eine einfache Aufgabe ändern? –

+0

Wahr, dass. Aber wenn Sie tibbles immer wie ich verwenden, haben Sie dieses Problem nicht. Aber vielleicht auch andere ;-) – Tino

+1

In diesem Fall brauchst du 'data.frame()' nicht mehr, 'df <- df [, order (Spaltennamen (df))] sollte gut funktionieren – ANG

0

Man kann auch wählen Sie die Spalten

df %>% select_(.dots = sort(colnames(df))) 
0

coutesy von Andre Elrico im ersten Kommentar zu bestellen, die direkteste Lösung scheint um den Tropfen zu verwenden:

data.frame(df[,order(colnames(df)),drop=F]) 
Verwandte Themen