Le altre risposte non rispondono esattamente alla domanda dell'OP proprio perché presuppongono che i dati di esempio siano diversi da quelli forniti dall'OP.
Se leggiamo letteralmente la domanda e vogliamo una soluzione generale che trovi colonne con cifre (di qualsiasi tipo di vettore), convertirle in numeri numerici e quindi eseguire un'altra operazione numerica, ad esempio l'arrotondamento.Possiamo usare purrr:dmap
e farlo in questo modo:
Ecco i dati come previsto dal PO, in cui tutti i colli sono fattori (un difetto fastidioso, ma siamo in grado di trattare con esso):
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
Noi' ll cercare colli con le cifre in loro, e fare un dataframe di indici per segnare i valori numerici:
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
Poi possiamo usare questi indici per selezionare un sottoinsieme dei colli nel dataframe originale e convertirli in numerico, e fare anche altre cose (in questo caso, arrotondando):
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))
E abbiamo ottenuto il risultato desiderato:
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
Questo potrebbe essere utile nel caso di un dataframe con un gran numero di colonne, e dove abbiamo molti tipo Cols carattere/Fattore pieno di cifre che vogliamo come numerico, ma è troppo noioso da fare a mano.
L'arrotondamento ha senso per "numeri", non per caratteri. Dovrai convertire 'Valore1' e' Valore2' come 'numerico', ad es. 'round (as.numeric (Value1), 0)' farebbe il lavoro, ma non hai specificato come dovrebbe essere fatto l'arrotondamento (cerca uno di 'trunc',' ceiling', o 'floor'). – chl