2016-06-27 5 views
1

Ich habe eine riesige Daten, die ich hier nicht hochladen kann.Sortieren Strings basierend auf der Nummer in einem Teil der Zeichenfolge

Ich habe zwei Arten von Spalten, ihre Namen beginnen mit T.H.L oder . Beide Typen sind im Format So####, z. B. T.H.L.So1_P1_A2 bis T.H.L.So10000_P1_A2, nummeriert.

Für jede T.H.L-Spalte gibt es eine Spalte mit der gleichen Endung.

Ich möchte mit dem ersten der T.H.L die Spalten durch die Zahlen nach So, um zu bestellen und dann die entsprechende T.H.L.varies.... Version für jede So Nummer.

Was ich versucht zu tun

library(gtools) 
mySorted<- df2[,mixedorder(colnames(df2))] 

die in der Nähe ist, ist es sie nach ihrer Nummer richtig sortiert, aber zuerst alle T.H.L und dann alle T.H.L.varies statt sie abwechselnd.

Ich habe die Spaltennamen auf Github veröffentlicht:

+1

Dies ist alles über Spaltennamen. Teilen Sie einfach Ihre Datenrahmenzeilen, teilen Sie einfach 'dput (Namen (df))' oder vielleicht 'dput (Namen (df) [1: 100])', wenn der erste zu lang ist. – Gregor

+0

Probieren Sie auch 'df2 = df [, grep (Muster ="^T \\. H \.. L \\. ", X = Namen (df))]' ... es könnte sein, was Sie wollen. Wenn das nicht das ist, was du willst, vielleicht kannst du klären, der Satz * "Bedeutet, ich will einen T.H.L. und einen T.H.L.Varies, die beide das gleiche Ende haben" * ergibt für mich keinen Sinn. – Gregor

+0

@Gregor Ich teilte es oben auf Github, weil ich es hier nicht setzen konnte – nik

Antwort

1

Okay, lassen Sie uns die Namen der Datenrahmen nennen (die Namen, die Sie neu anordnen möchten) x:

x = names(df2) 

# first remove the ones without numbers 
# because we want to use the numbers for ordering 
no_numbers = c("T.H.L", "T.H.L.varies....") 
x = x[! x %in% no_numbers] 

# now extract the numbers so we can order them 
library(stringr) 
x_num = as.numeric(str_extract(string = x, pattern = "(?<=So)[0-9]+")) 

# calculate the order first by number, then alphabetically to break ties 
ord = order(x_num, x) 

# verify it is working 
head(c(no_numbers, x[ord]), 10) 
# [1] "T.H.L"      "T.H.L.varies...."   "T.H.L.So1_P1_A1"   
# [4] "T.H.L.varies.....So1_P1_A1" "T.H.L.So2_P1_A2"   "T.H.L.varies.....So2_P1_A2" 
# [7] "T.H.L.So3_P1_A3"   "T.H.L.varies.....So3_P1_A3" "T.H.L.So4_P1_A4"   
# [10] "T.H.L.varies.....So4_P1_A4" 

# finally, reorder your data frame columns 
df2 = df2[, c(no_numbers, x[ord])] 

Und Sie getan werden sollte.

+0

Vielleicht könnten Sie 'dput (Kopf (Namen (x), 10))' 'teilen? Es funktioniert, wenn ich in Ihrem GitHub-Beitrag lese, machte es einen Zeichenvektor und nannte es 'x'. – Gregor

+0

dput (Kopf (x, 10))? weil dput (head (namen (x), 10)) gibt mir NULL – nik

+0

Ja, 'dput (Kopf (Namen (df2), 10))' Vielleicht – Gregor

Verwandte Themen