web-dev-qa-db-fra.com

Conversion de minuscules en majuscules de toutes les valeurs de toutes les variables de caractère dans le cadre de données

J'ai un dataframe mixte de caractères et de variables numériques.

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

Je veux convertir tous les caractères minuscules du cadre de données en majuscules. Y a-t-il un moyen de faire cela en un seul coup sans le faire de manière répétée sur chaque variable de caractère?

69
user702432

À partir des exemples de données suivants:

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

Vous pouvez utiliser :

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

Qui donne :

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

À partir du paquet dplyr, vous pouvez également utiliser la fonction mutate_all () en combinaison avec toupper (). Cela affectera les classes de personnage et de facteur.

library(dplyr)
df <- mutate_all(df, funs=toupper)
44
Trenton Hoffman

C'est simple avec la fonction apply dans R

f <- apply(f,2,toupper)

Pas besoin de vérifier si la colonne est caractère ou tout autre type.

7
Shalini Baranwal

Un commentaire latéral ici pour ceux qui utilisent l'une de ces réponses. La réponse de Juba est excellente, car elle est très sélective si vos variables sont des nombres ou des chaînes de caractères. Cependant, si vous avez une combinaison (par exemple, a1, b1, a2, b2), etc., les caractères ne seront pas convertis correctement.

Comme le note @Trenton Hoffman,

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

affecte à la fois les classes de caractère et de facteur et fonctionne pour les "variables mixtes"; par exemple. si votre variable contient à la fois un caractère et une valeur numérique (par exemple, a1), les deux seront convertis en facteur. Globalement, ce n’est pas une préoccupation majeure, mais si vous finissez par vouloir faire correspondre match.frames par exemple

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

où df1 a été converti et que df2 contient un fichier data.frame non converti ou similaire, cela peut entraîner des problèmes. Le problème est que vous devez exécuter brièvement

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

Si vous travaillez avec des données génomiques, sachez que cela peut être utile.

6
OFish

Si vous devez gérer des data.frames incluant des facteurs, vous pouvez utiliser:

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"

Utilisez mutate_each_ pour convertir les facteurs en caractères, puis convertissez tous les caractères en majuscules.

   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

Donne

  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

Tandis que

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

Si vous souhaitez simplement convertir une ligne en majuscule, utilisez le code ci-dessous:

df [[1]] <- toupper (df [[1]])

0
Vaibhav Kabdwal

Une autre alternative consiste à utiliser une combinaison des fonctions mutate_if () et str_to_uper (), toutes deux issues du paquet tidyverse:

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

Cela convertira toutes les variables de chaîne du cadre de données en majuscules. str_to_lower () fait le contraire.