2012-08-24 20 views
5

我有數百個字符向量從數據庫導入到R中 - 每個長度爲6-7百萬。它們是數字或因子數據,具有標籤的字符(字母) - 要設置的級別,所有因子,都有一些NAs。作爲一個例子有效使用as.numeric()和factor()

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

是否有強迫VECA到數字和vecB至因素的有效途徑。問題是我不知道數據和因子向量在數據中的哪個位置,並且一個一個地遍歷它們是很繁瑣的。

+0

這些向量都在同一個對象中,還是它們是單獨的對象?他們是否有固定的名字,如你的例子? –

+0

我將在函數中從數據庫中一次一個地調用每個向量。該功能可能是並行的。在某些字符串中會有特殊字符 - 但僅限於因子類型數據。 – Yoda

回答

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 
+0

天才!非常感謝。 – Yoda

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) 
+1

僅測試前500個元素可能會更高效。 –