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

时间:2012-08-24 18:57:19

标签: r character numeric

我有数百个字符向量从数据库导入到R中 - 每个向量的长度为6-7百万。它们是数字或因子数据,具有标签的字符(字母) - 要设置的级别,所有因子,都有一些NA。作为一个例子

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

是否有一种有效的方法可以将vecA强制转换为数字和vecB。问题是我不知道数据和因子向量在数据中的位置,逐个浏览它们是很繁琐的。

2 个答案:

答案 0 :(得分:7)

我可能会使用tryCatch(),首先尝试将每个向量转换为类"numeric"。如果as.numeric()抛出警告消息(就像输入向量包含非数字字符时那样),我会捕获警告,而是将向量转换为类"factor"

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

答案 1 :(得分:1)

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

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

然后将矢量包装到列表中并使用lapply

new.vectors <- lapply(old.vectors,convert.numeric)