有效使用as.numeric()和factor()

有效使用as.numeric()和factor(),r,character,numeric,R,Character,Numeric,我从数据库中导入了数百个字符向量到R中,每个字符向量的长度为600-700万。它们要么是数字数据,要么是因子数据,标签上有字符(字母)——需要设置级别,所有因子都有一些NAs。例如 vecA <- c("1",NA, "2",....,NA, "100") vecB <- c("smith", NA, NA, ... , "jones") vecA也许是正则表达式?对于每个向量,匹配看起来像数字的东西 convert.numeric <- function(vec) {

我从数据库中导入了数百个字符向量到R中,每个字符向量的长度为600-700万。它们要么是数字数据,要么是因子数据,标签上有字符(字母)——需要设置级别,所有因子都有一些NAs。例如

vecA <- c("1",NA, "2",....,NA, "100")
vecB <- c("smith", NA, NA, ... , "jones")

vecA也许是正则表达式?对于每个向量,匹配看起来像数字的东西

convert.numeric <- function(vec) {
  if( grepl("^[0-9]*(\\.[0-9]+)?$",vec)) == !is.na(vec)) ) {
    vec <- as.numeric(vec)
  } else { vec <- as.factor(vec) }
  return(vec)
}

我可能会使用
tryCatch()
,首先尝试将每个向量转换为类
“numeric”
。如果
as.numeric()


vecA这些向量都在同一个对象中,还是单独的对象?它们是否有常规名称,如您的示例中所示?我将调用函数中的每个向量,从数据库一次调用一个。该函数可以并行化。某些字符串中会有特殊字符,但仅用于因子类型数据。仅测试前500个元素可能更有效。
new.vectors <- lapply(old.vectors,convert.numeric)
vecA <- c("1",NA, "2",NA, "100")
vecB <- c("smith", NA, NA, "jones")

myConverter <- function(X) tryCatch(as.numeric(X), 
                                    warning = function(w) as.factor(X))

myConverter(vecA)
# [1]   1  NA   2  NA 100
myConverter(vecB)
# [1] smith <NA>  <NA>  jones
# Levels: jones smith