2016-05-27 18 views
3

ich die Zeilen einer Datenrahmen neu ordnen will, die wie folgt aussieht:Sortier Reihen nach einer Reihe Muster

qs=c("q11", "q22", "q2", "q6", "q10") 
ans=rep(1,times=length(qs)) 
df=data.frame(qs,ans) 
arrange(df,qs) 

qs ans 
1 q10 1 
2 q11 1 
3 q2 1 
4 q22 1 
5 q6 1 

Allerdings mag ich die Sortierung der Zeilen in der viel logischen Reihenfolge suchen , wie zum Beispiel:

qs ans 
1 q2 1 
2 q6 1 
3 q10 1 
4 q11 1 
5 q22 1 

Kann mir jemand dabei helfen?

Antwort

4

Verwenden R base:

df <- df[order(as.integer(gsub("q", "", as.character(df$qs)))), ] 

Sie zum Beispiel df, ergibt dies:

qs ans 
3 q2 1 
4 q6 1 
5 q10 1 
1 q11 1 
2 q22 1 

Sie könnten beachten Sie, dass rownames sind nicht 1, 2, 3, 4, 5 nach Neuordnung; Sie tun können:

rownames(df) <- 1:nrow(df) 

es schön aussehen zu lassen:

qs ans 
1 q2 1 
2 q6 1 
3 q10 1 
4 q11 1 
5 q22 1 
+0

Ihre Antwort half, Danke. Wie bereits zu akun kommentiert, ist eine damit zusammenhängende Frage, ob die Zeilen in dieser Form 'qs = c ("Q.1a", "Q.1b", "Q.10a", "Q.10b", " Q.10c "," Q.6a "," Q.6b ") in einem solchen Fall funktionierten beide Antworten nicht. – msh855

2

Wir verwenden mixedorder von gtools nach dem 'qs' zu character Klasse Umwandlung

library(gtools) 
df1 <- `row.names<-`(df[mixedorder(as.character(df$qs)),], NULL) 
df1 
# qs ans 
#1 q2 1 
#2 q6 1 
#3 q10 1 
#4 q11 1 
#5 q22 1 

Oder wir base R auch durch Entfernen der nicht-numerischen Zeichen mit gsub, konvertieren numeric, order verwenden können die Reihen.

df[order(as.numeric(gsub("\\D+", "", df$qs))),] 
+0

Keine Handlung akrun, aber warum verwenden Sie '\' row.names <- \ '' machen Code viel schwieriger zu lesen und pflegen (vor allem für Anfänger) statt einer zweiten Zeile? –

+0

@docendodiscimus Weil ich bemerkt habe, dass das andere Poster bereits die 'rownames (df) <- ..' gepostet hat und wenn ich es verwende, wird es überflüssig. Außerdem besteht die Gefahr, dass der OP meinen könnte, dass meine Antwort nicht vollständig ist, also habe ich die Chance genutzt und ein mögliches Plagiat vermieden. – akrun

+0

@akrun Ihre Antwort hat geholfen, Danke. Eine verwandte Frage dazu ist, was ist, wenn die Zeilen diese Form 'qs = c ("Q.1a", "Q.1b", "Q.10a", "Q.10b", "Q.10c", " Q.6a "," Q.6b ") in einem solchen Fall funktionierten beide Antworten nicht. – msh855