R-将数据框列转换为数值-强制错误导致的NA

时间:2019-10-17 06:32:37

标签: r

我正在尝试从此处执行代码:

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

在具有140列的数据框中

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

问题是对于某些列,我得到了NA。有没有办法以某种方式从代码中排除这些列,以便我保留数据并且它们不会转换为NA?我认为这些列的类型是字符,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

如果您已经知道要删除的列的索引,则可以对数据框进行子集化以仅定位某些列:

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))
})

要使用列名而不是索引来实现类似的逻辑:

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))
})

答案 1 :(得分:0)

在因子水平内也可以替换任何不适当的字符以更好地提取任何数字:

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)