60 votes

Comment arrondir un data.frame en R qui contient des variables de caractère?

Je ai un dataframe et je souhaite arrondir tous les nombres (prêts pour l'exportation). Cela doit être simple, mais je rencontre des problèmes parce que certaines parties du dataframe ne sont pas des chiffres numériques. Par exemple, je veux arrondir les chiffres au chiffre entier le plus proche dans l'exemple ci-dessous:

ID = c("a","b","c","d","e")
Value1 = c("3.4","6.4","8.7","1.1","0.1")
Value2 = c("8.2","1.7","6.4","1.9","10.3")
df<-data.frame(ID,Value1,Value2)

Est-ce que quelqu'un peut m'aider? Je peux arrondir des colonnes individuelles (par exemple, round(df$Value1, 2)) mais je veux arrondir un tableau entier qui contient certaines colonnes qui ne sont pas numériques.

1 votes

L'arrondi a du sens pour les "nombres", pas pour les caractères. Vous devrez convertir Value1 et Value2 en numérique, par exemple round(as.numeric(Value1), 0) devrait faire l'affaire, mais vous n'avez pas spécifié comment l'arrondi devrait être effectué (recherchez l'un de troncature, plafond ou plancher).

105voto

user1165199 Points 442

Je pense que le moyen le plus propre de le faire maintenant est d'utiliser dplyr

library(dplyr)
df %>% 
 mutate_if(is.numeric, round)

Cela arrondira toutes les colonnes numériques de votre dataframe

0 votes

df %>% transmettre(à travers(où(est.numérique), arrondir, chiffres=3))

37 votes

Brillant! bibliothèque(dplyr); df %>% mutate_if(est.numérique, arrondi, digits=3)

8 votes

mutate_if a été remplacé par across! maintenant utilisez library(dplyr); df %>% mutate(across(is.numeric, round, digits=3))

53voto

akhmed Points 3238

Reconnaissant que c'est une vieille question et qu'une réponse est acceptée, je voudrais offrir une autre solution puisque la question apparaît en haut des résultats de Google.

Une solution plus générale est de créer une fonction séparée qui recherche toutes les variables numériques et les arrondit au nombre spécifié de chiffres :

round_df <- function(df, digits) {
  nums <- vapply(df, is.numeric, FUN.VALUE = logical(1))

  df[,nums] <- round(df[,nums], digits = digits)

  (df)
}

Une fois définie, vous pouvez l'utiliser comme suit :

> round_df(df, digits=3)

1 votes

Génial, solution simple que je n'aurais jamais pensée! Merci!

39voto

Pierre Lapointe Points 12056

Assurez-vous d'abord que vos colonnes numériques sont effectivement numériques :

ID = c("a","b","c","d","e")
Value1 = as.numeric(c("3.4","6.4","8.7","1.1","0.1"))
Value2 = as.numeric(c("8.2","1.7","6.4","1.9","10.3"))
df<-data.frame(ID,Value1,Value2, stringsAsFactors = FALSE)

Ensuite, arrondissez uniquement les colonnes numériques :

df[,-1] <-round(df[,-1],0) #le "-1" exclut la colonne 1
df

  ID Value1 Value2
1  a      3      8
2  b      6      2
3  c      9      6
4  d      1      2
5  e      0     10

0 votes

Simple et efficace :)

21voto

Alvis Points 470

Je sais que ma réponse est tardive, mais j'ai également rencontré ce même problème. Après quelques recherches, j'ai trouvé que c'était la solution la plus élégante:

data.frame(lapply(x, function(y) if(is.numeric(y)) round(y, 2) else y)) 

Solution originale de: Jean V. Adams Statisticien Service géologique des États-Unis Centre scientifique des Grands Lacs 223 East Steinfest Road Antigo, WI 54409 USA

http://r.789695.n4.nabble.com/round-a-data-frame-containing-character-variables-td3732415.html

0 votes

Il s'agit d'une solution standard.

12voto

trisaratops Points 163

Voici une phrase que j'aime utiliser : (cela appliquera la fonction round uniquement aux colonnes de la classe spécifiée dans l'argument classes)

df2 <- rapply(object = df, f = round, classes = "numeric", how = "replace", digits = 0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X