2012-08-24 7 views
5

私はデータベースからRにインポートされた数百の文字ベクトルを持っています - それぞれ6〜700万の長さです。それらは、ラベル用の文字(文字)を持つ数値データまたは因子データのいずれかです。レベルの設定、すべての因子、すべてにはいくつかのNAsがあります。例としてas.numeric()とfactor()の効率的な使用

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

vecAを数値に、vecBを因数に強制的に強制する効率的な方法はありますか?問題は、数値ベクトルと要素ベクトルがデータ内のどこにあるのかわからないことです。一つずつ順番に行くのは面倒です。

+0

これらのベクターはすべて同じオブジェクト内にありますか、それとも個々のオブジェクトですか?あなたの例のように、彼らは普通の名前を持っていますか? –

+0

私は各ベクトルを関数からデータベースから一度に1つずつ呼び出すつもりです。その関数は並列化されている可能性があります。いくつかの文字列には特殊文字がありますが、因子タイプのデータのみになります。 – Yoda

答えて

7

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を使用しています。 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

Genius!どうもありがとうございます。 – Yoda

1

おそらく正規表現ですか?それぞれのベクトルについて、数字のようなものにマッチします。私はおそらくクラス"numeric"に各ベクトルを変換する最初の試行、tryCatch()を使用したい

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

最初の500要素だけをテストするほうが効率的かもしれません。 –

関連する問題