2013-05-13 10 views
46

Ich habe eine mixed dataframe von Zeichen und numerischen Variablen.Konvertieren von Kleinbuchstaben in Großbuchstaben alle Werte in allen Zeichenvariablen im Datenrahmen

city,hs_cd,sl_no,col_01,col_02,col_03 
Austin,1,2,,46,Female 
Austin,1,3,,32,Male 
Austin,1,4,,27,Male 
Austin,1,5,,20,Female 
Austin,2,2,,42,Female 
Austin,2,1,,52,Male 
Austin,2,3,,25,Male 
Austin,2,4,,22,Female 
Austin,3,3,,30,Female 
Austin,3,1,,65,Female 

Ich möchte alle Kleinbuchstaben im Datenformat in Großbuchstaben konvertieren. Gibt es eine Möglichkeit, dies auf einmal zu tun, ohne es wiederholt über jede Zeichenvariable zu tun?

Antwort

57

mit den folgenden Beispieldaten starten:

df <- data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],stringsAsFactors=FALSE) 

    v1 v2 v3 
1 a 1 j 
2 b 2 k 
3 c 3 l 
4 d 4 m 
5 e 5 n 

können Sie verwenden:

data.frame(lapply(df, function(v) { 
    if (is.character(v)) return(toupper(v)) 
    else return(v) 
})) 

Welche gibt:

v1 v2 v3 
1 A 1 J 
2 B 2 K 
3 C 3 L 
4 D 4 M 
5 E 5 N 
+11

Ich habe gerade gefunden, dass dies auch funktioniert: df = as.data.frame (sapply (df, toupper)) – user702432

24

Vom dplyr Paket können Sie auch den mutate_all verwenden () Funktion in Kombination mit toupper(). Dies betrifft sowohl die Charakter- als auch die Faktorklasse.

library(dplyr) 
df <- mutate_all(df, funs=toupper) 
+1

Für jeden, der dies von heute an betrachtet, beachten Sie, dass 'muate_each()' abgeschrieben wird; Statt dessen (vorausgesetzt, Sie möchten Ihren gesamten 'data.frame' nach oben/unten konvertieren) verwenden Sie' mutate_all() '. – MusTheDataGuy

+0

'muate_at()' könnte verwendet werden, um mit nur einer Variablen zu arbeiten – Kevin

4

Eine Seite Kommentar hier für die eine dieser Antworten verwenden. Jubas Antwort ist großartig, da es sehr selektiv ist, wenn Ihre Variablen entweder Zahlen oder Zeichenfolgen sind. Wenn Sie jedoch eine Kombination (z. B. a1, b1, a2, b2) usw. haben, werden die Zeichen nicht richtig konvertiert.

Wie @Trenton Hoffman stellt fest,

library(dplyr) 
df <- mutate_each(df, funs(toupper)) 

betrifft sowohl Charakter und Faktorklassen und arbeitet für "gemischte Variablen"; z.B. Wenn Ihre Variable sowohl ein Zeichen als auch einen Zahlenwert (z. B. a1) enthält, werden beide in einen Faktor umgewandelt. Insgesamt ist dies nicht zu viel von einer Besorgnis, aber wenn Sie Match data.frames zum Beispiel wollen am Ende

df3 <- df1[df1$v1 %in% df2$v1,] 

wo df1 umgewandelt wurde wurde und DF2 enthält eine nicht-umgewandelt data.frame oder ähnlich Dies kann zu Problemen führen. Die Arbeit um ist, dass Sie kurz

df2 <- df2 %>% mutate_each(funs(toupper), v1) 
#or 
df2 <- df2 %>% mutate_each(df2, funs(toupper)) 
#and then 
df3 <- df1[df1$v1 %in% df2$v1,] 

laufen haben, wenn Sie mit genomischen Daten arbeiten, ist dies, wenn dies zu wissen nützlich sein kann.

1

Wenn Sie mit data.frames befassen müssen, die Faktoren beinhalten können Sie:

df = data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],v4=as.factor(letters[1:5]),v5=runif(5),stringsAsFactors=FALSE) 

df 
    v1 v2 v3 v4  v5 
    1 a 1 j a 0.1774909 
    2 b 2 k b 0.4405019 
    3 c 3 l c 0.7042878 
    4 d 4 m d 0.8829965 
    5 e 5 n e 0.9702505 


sapply(df,class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "factor" "numeric" 

Verwenden mutate_each_ Faktoren zum Charakter umwandeln dann alle konvertieren in Großbuchstaben

upper_it = function(X){X %>% mutate_each_(funs(as.character(.)), names(.[sapply(., is.factor)])) %>% 
    mutate_each_(funs(toupper), names(.[sapply(., is.character)]))} # convert factor to character then uppercase 

Gibt

upper_it(df) 
     v1 v2 v3 v4 
    1 A 1 J A 
    2 B 2 K B 
    3 C 3 L C 
    4 D 4 M D 
    5 E 5 N E 

Während

sapply(upper_it(df),class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "character" "numeric" 
0

Es ist einfach mit anwenden Funktion in R

f < - gelten (f, 2, toupper)

Keine Notwendigkeit zu prüfen, ob die Spalte Zeichen oder jede andere Art.

Verwandte Themen