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)