简体   繁体   中英

R - convert dataframe columns to numeric - NAs introduced by coercion error

I am trying to execute the code from here:

Change the class from factor to numeric of many columns in a data frame

in a dataframe with 140 columns

cols = c(1:140);    
merged_dataset[,cols] = apply(merged_dataset[,cols], 2, function(x) as.numeric(as.character(x)));

the problem is for some columns I get NAs. Is there a way somehow exclude these columns from the code so that I keep the data and they don't get transformed into NAs? I see the type of these columns is character if that helps.

If you already know the indices of the columns you want to drop, then you may subset your data frame to target only certain columns:

cols <- c(1:140)         # all columns
cols.skip <- c(1,3,5,21) # columns which CAN'T be converted to numeric
cols.keep <- cols[!cols %in% cols.skip]
merged_dataset[,cols.keep] <- apply(merged_dataset[,cols.keep], 2, function(x) {
    as.numeric(as.character(x))
})

To implement similar logic using column names rather than indices:

cols.skip <- c("a", "b", "c")
cols.keep <- !(names(merged_dataset) %in% cols.skip)
merged_dataset[,cols.keep] <- apply(merged_dataset[,cols.keep], 2, function(x) {
    as.numeric(as.character(x))
})

Substitution of any improper characters inside factor levels can also occur to better extract any numbers:

convert_factors_to_numeric <- function(df) {

  as.data.frame(lapply(df,
                       function(x) {

                         if (is.factor(x)) {

                           as.numeric(as.character(trimws(x),
                                        which = "both"))

                         } else{

                           x

                         }
                       }
                     ),

                stringsAsFactors = FALSE)

}

df_converted <- convert_factors_to_numeric(df) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM