Les autres réponses ne répondent pas tout à fait exactement à la question de l'OP car elles supposent que les données d'exemple sont différentes de celles fournies par l'OP.
Si nous lisons littéralement la question et que nous voulons une solution générale qui trouvera les colonnes contenant des chiffres (de n'importe quel type de vecteur), les convertira en numérique, puis effectuera une autre opération numérique, telle que l'arrondi. Nous pouvons utiliser purrr:dmap
et le faire ainsi :
Voici les données telles que fournies par l'OP, où toutes les colonnes sont des facteurs (une valeur par défaut ennuyeuse, mais nous pouvons y remédier) :
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)
str(df)
'data.frame': 5 obs. of 3 variables:
$ ID : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
$ Value1: Factor w/ 5 levels "0.1","1.1","3.4",..: 3 4 5 2 1
$ Value2: Factor w/ 5 levels "1.7","1.9","10.3",..: 5 1 4 2 3
Nous rechercherons les colonnes contenant des chiffres et créerons un dataframe d'indices pour marquer les numériques :
library(dplyr)
library(purrr)
df_logical <-
df %>%
dmap(function(i) grepl("[0-9]", i))
df_logical
ID Value1 Value2
1 FALSE TRUE TRUE
2 FALSE TRUE TRUE
3 FALSE TRUE TRUE
4 FALSE TRUE TRUE
5 FALSE TRUE TRUE
str(df_logical)
'data.frame': 5 obs. of 3 variables:
$ ID : logi FALSE FALSE FALSE FALSE FALSE
$ Value1: logi TRUE TRUE TRUE TRUE TRUE
$ Value2: logi TRUE TRUE TRUE TRUE TRUE
Ensuite, nous pouvons utiliser ces indices pour sélectionner un sous-ensemble des colonnes du dataframe d'origine, les convertir en numérique, et faire d'autres choses également (dans ce cas, l'arrondi) :
df_numerics <-
map(1:ncol(df), function(i) ifelse(df_logical[,i],
as.numeric(as.character(df[,i])),
df[,i])) %>%
dmap(round, 0) %>%
setNames(names(df))
Et nous avons le résultat souhaité :
df_numerics
ID Value1 Value2
1 1 3 8
2 2 6 2
3 3 9 6
4 4 1 2
5 5 0 10
str(df_numerics)
'data.frame': 5 obs. of 3 variables:
$ ID : num 1 2 3 4 5
$ Value1: num 3 6 9 1 0
$ Value2: num 8 2 6 2 10
Ceci pourrait être utile dans le cas d'un dataframe avec un grand nombre de colonnes, et où nous avons de nombreuses colonnes de type caractère/facteur remplies de chiffres que nous voulons en numérique, mais qu'il est trop fastidieux de le faire manuellement.
1 votes
L'arrondi a du sens pour les "nombres", pas pour les caractères. Vous devrez convertir
Value1
etValue2
ennumérique
, par exempleround(as.numeric(Value1), 0)
devrait faire l'affaire, mais vous n'avez pas spécifié comment l'arrondi devrait être effectué (recherchez l'un detroncature
,plafond
ouplancher
).