2017-08-29 2 views
3

Ich habe einen Datenrahmen mit einer Variablen namens „Control_Category“. Die Variable hat sechs Namen drin, die der Einfachheit halber ich Generika machen werde:Ändern Zeichenfolge Namen in einem Datenrahmen basierend auf einem Zustand

df <- data.frame(Control_Category = c("Really Long Name One", 
"Super Really Long Name Two", 
"Another Really Flippin' Long Name Three", 
",Seriously, It's a Fourth Long Name", 
"Definitely a Fifth Long Name", 
"Finally, This guy is done, number six")) 

ich dies mit einem leichten Witz zu machen. Während also die Namen lang sind, sind sie sauber, da die Werte für jedes (1-6) konsistent sind. In diesem spezifischen Zeichenvektor des data.frames gibt es Hunderte von Einträgen, die mit einem dieser sechs übereinstimmen.

Was ich tun muß, ist den langen Namen mit einem kurzen Namen zu ersetzen. Deshalb kann, wenn eine der oben genannten Namen identifiziert werden, ersetzen Sie diesen Namen mit einer kürzeren Version, wie:

One Zwei Drei Vier Fünf Sechs

habe ich versucht, eine Funktion ‚case_when‘ verwenden und es Scheiterte kläglich. Jede Hilfe wäre willkommen.

Weitere Informationen Basierend auf Fragen von Gemeinschafts

Die Reihenfolge der Elemente keine Rolle spielt. Es gibt keine Bezeichnung von 1 - 6. Es sind einfach sechs und ich habe sechs dumme lange Saiten gemacht. Die Saiten selbst sind lang.

Also, überall "Super Really Long Name Two" existiert, muss dieser Wert auf etwas wie "ZWEI" oder ein "Short_Name", dass ungefähr "ZWEI" aktualisiert werden. In der Realität heißt die Kategorie "Audit, Prüfung und Prüfungsergebnisse“der Kurzname im Idealfall nur sein würde.‚AUDIT‘

+0

in Ihrem realen Daten, sind 4 und 5 immer von der "vierten" repräsentiert, "fünfte", im Gegensatz zu 1, 2, 3 und 6, die immer "eins", "zwei", " drei "," sechs "? – neilfws

+1

Ich denke, was Sie suchen Faktor ist: 'df $ Control_Category <- Faktor (df $ Control_Category, level = df $ Control_Category, Etikett = c (1: 6))' – parksw3

+0

@ parksw3 denke ich, in den realen Daten, Es gibt mehr als 6 Zeilen und die zu ersetzenden Werte sind nicht geordnet. – neilfws

Antwort

3

Sie haben soeben gsub() einmal für jeden Ersatz verwenden könnten.

df$Control_Category <- gsub('Really Long Name One', 'One', df$Control_Category) 

Sie können wiederholen ähnliche Logik des anderen fünf lange zu handhaben/Kurznamenpaare

+0

Es ist nicht schön :-) aber es funktioniert. – Zach

2

He Re ist ein größerer Datenrahmen mit langen Namen:

set.seed(101) 
long_names <- c("Really Long Name One", 
       "Super Really Long Name Two", 
       "Another Really Flippin' Long Name Three", 
       ",Seriously, It's a Fourth Long Name", 
       "Definitely a Fifth Long Name", 
       "Finally, This guy is done, number six") 

df <- data.frame(control_category=sample(long_names, 100, replace=TRUE)) 
head(df) 

##       control_category 
## 1 Another Really Flippin' Long Name Three 
## 2     Really Long Name One 
## 3   Definitely a Fifth Long Name 
## 4  ,Seriously, It's a Fourth Long Name 
## 5    Super Really Long Name Two 
## 6    Super Really Long Name Two 

Mit der unique Funktion erhalten Sie die Kategorienamen geben:

category <- unique(df$control_category) 
print(category) 

## [1] Another Really Flippin' Long Name Three 
## [2] Really Long Name One     
## [3] Definitely a Fifth Long Name   
## [4] ,Seriously, It's a Fourth Long Name  
## [5] Super Really Long Name Two    
## [6] Finally, This guy is done, number six 
## 6 Levels: ,Seriously, It's a Fourth Long Name ... 

Beachten Sie, dass die Werte in alphabetischer Reihenfolge (siehe levels(category)). In diesem Fall ist es am einfachsten, die Reihenfolge manuell zu ändern, indem Sie sich die aktuelle Reihenfolge ansehen. In diesem Fall wird Ihnen category[c(2, 5, 1, 4, 3, 6)] die richtige Reihenfolge geben. Schließlich

df$control_category <- factor(
    df$control_category, 
    levels=category[c(2, 5, 1, 4, 3, 6)], 
    labels=c("one", "two", "three", "four", "five", "six") 
) 
head(df) 

## control_category 
## 1   three 
## 2    one 
## 3    five 
## 4    four 
## 5    two 
## 6    two 
+0

Reihenfolge spielt keine Rolle. Ich muss nur alle Namen ersetzen, die oben in der aktualisierten Frage angegeben sind. Das heißt, diese Datenspalte durchlaufen, den Namen auswerten, aktualisieren, fortfahren, wiederholen. – Zach

Verwandte Themen