converting multiple columns from character to numeric format in r converting multiple columns from character to numeric format in r r r

converting multiple columns from character to numeric format in r


You could try

DF <- data.frame("a" = as.character(0:5),                 "b" = paste(0:5, ".1", sep = ""),                 "c" = letters[1:6],                 stringsAsFactors = FALSE)# Check columns classessapply(DF, class)#           a           b           c # "character" "character" "character" cols.num <- c("a","b")DF[cols.num] <- sapply(DF[cols.num],as.numeric)sapply(DF, class)#          a           b           c #  "numeric"   "numeric" "character"


If you're already using the tidyverse, there are a few solution depending on the exact situation.

Basic if you know it's all numbers and doesn't have NAs

library(dplyr)# solutiondataset %>% mutate_if(is.character,as.numeric)

Test cases

df <- data.frame(  x1 = c('1','2','3'),  x2 = c('4','5','6'),  x3 = c('1','a','x'), # vector with alpha characters  x4 = c('1',NA,'6'), # numeric and NA  x5 = c('1',NA,'x'), # alpha and NA  stringsAsFactors = F)# display starting structuredf %>% str()

Convert all character vectors to numeric (could fail if not numeric)

df %>%  select(-x3) %>% # this removes the alpha column if all your character columns need converted to numeric  mutate_if(is.character,as.numeric) %>%  str()

Check if each column can be converted. This can be an anonymous function. It returns FALSE if there is a non-numeric or non-NA character somewhere. It also checks if it's a character vector to ignore factors. na.omit removes original NAs before creating "bad" NAs.

is_all_numeric <- function(x) {  !any(is.na(suppressWarnings(as.numeric(na.omit(x))))) & is.character(x)}df %>%   mutate_if(is_all_numeric,as.numeric) %>%  str()

If you want to convert specific named columns, then mutate_at is better.

df %>% mutate_at('x1', as.numeric) %>% str()


You can use index of columns:data_set[,1:9] <- sapply(dataset[,1:9],as.character)