我有数百个从数据库导入到 R 中的字符向量——每个字符向量的长度为 6-7 百万。它们是具有标签字符(字母)的数字或因子数据 - 要设置的级别,所有因子,都有一些 NA。举个例子
vecA <- c("1",NA, "2",....,NA, "100")
vecB <- c("smith", NA, NA, ... , "jones")
有没有一种有效的方法来强制 vecA 为数字和 vecB 为因子。问题是我不知道数字和因子向量在数据中的位置,并且一一浏览它们很乏味。
我可能会使用tryCatch()
, 首先尝试将每个向量转换为 class "numeric"
。如果as.numeric()
抛出警告消息(就像输入向量包含非数字字符时一样),我会捕获警告并将向量转换为 class "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
也许是一个正则表达式?对于每个向量,匹配看起来像数字的东西。
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)