Konvertieren Sie alle Werte in allen Zeichenvariablen im Datenrahmen von Klein- in Großbuchstaben

73

Ich habe einen gemischten Datenrahmen aus Zeichen und numerischen Variablen.

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 Datenrahmen in Großbuchstaben konvertieren. Gibt es eine Möglichkeit, dies auf einmal zu tun, ohne es wiederholt über jede Zeichenvariable zu tun?

user702432
quelle

Antworten:

80

Beginnend mit den folgenden Beispieldaten:

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

Sie können verwenden:

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

Welches gibt:

  v1 v2 v3
1  A  1  J
2  B  2  K
3  C  3  L
4  D  4  M
5  E  5  N
Juba
quelle
23
Ich habe gerade festgestellt, dass dies auch funktioniert: df = as.data.frame (sapply (df, toupper))
user702432
47

Aus dem dplyrPaket können Sie die mutate_all()Funktion auch in Kombination mit verwenden toupper(). Dies wirkt sich sowohl auf Zeichen- als auch auf Faktorklassen aus.

library(dplyr)
df <- mutate_all(df, funs=toupper)
Trenton Hoffman
quelle
3
Wenn Sie dies von heute an betrachten, beachten Sie, dass dies mutate_each()abgeschrieben wird. data.frameVerwenden Sie stattdessen (vorausgesetzt, Sie möchten Ihr gesamtes in obere / untere konvertieren ) mutate_all().
Mus
7
'mutate_at ()' kann verwendet werden, um mit nur einer Variablen zu arbeiten
Kevin
1
das hat bei mir funktioniert: df <- mutate_all (df ,, funs (touper))
Tony Cronin
Stellen Sie sicher, mutate_all(df, .funs = toupper)dass Sie die richtige Syntax verwenden, da sonst eine Fehlermeldung angezeigt wird. Es sollte ein "." vor dem funsParameter. Wenn Sie sich an das halten möchten, tidyversekönnen Sie auch das stringr str_to_upperanstelle des verwenden base toupper.
Bradylange
10

Es ist einfach mit Apply-Funktion in R.

f <- apply(f,2,toupper)

Sie müssen nicht überprüfen, ob die Spalte ein Zeichen oder ein anderer Typ ist.

Shalini Baranwal
quelle
Beachten Sie, dass dadurch numerische Spalten in Zeichen und die Daten von data.frame in Matrix konvertiert werden.
Joachim Schork
6

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

Wie @Trenton Hoffman bemerkt,

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

wirkt sich sowohl auf Zeichen- als auch auf Faktorklassen aus und funktioniert für "gemischte Variablen"; Wenn Ihre Variable beispielsweise sowohl ein Zeichen als auch einen Zahlenwert enthält (z. B. a1), werden beide in einen Faktor konvertiert. Insgesamt ist dies kein allzu großes Problem, aber wenn Sie am Ende beispielsweise Match Data.frames wünschen

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

Wenn df1 konvertiert wurde und df2 einen nicht konvertierten data.frame oder ähnliches enthält, kann dies einige Probleme verursachen. Die Lösung besteht darin, dass Sie kurz laufen müssen

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

Wenn Sie mit Genomdaten arbeiten, ist dies hilfreich, wenn Sie wissen, dass dies nützlich sein kann.

OFish
quelle
1

Wenn Sie sich mit data.frames befassen müssen, die Faktoren enthalten, können Sie Folgendes verwenden:

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 Sie mutate_each_, um Faktoren in Zeichen umzuwandeln, und konvertieren Sie dann alle 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"
mmann1123
quelle
1

Eine andere Alternative besteht darin, eine Kombination von mutate_if()und eine str_to_uper()Funktion aus dem tidyverse-Paket zu verwenden:

df %>% mutate_if(is.character, str_to_upper) -> df

Dadurch werden alle Zeichenfolgenvariablen im Datenrahmen in Großbuchstaben konvertiert. str_to_lower()mach das Gegenteil.

André Cordeiro Valério
quelle
0

Wenn Sie nur eine bestimmte Zeile in Großbuchstaben konvertieren möchten, verwenden Sie alternativ den folgenden Code:

df[[1]] <- toupper(df[[1]])
Vaibhav Kabdwal
quelle