5

データベースから R にインポートされた数百の文字ベクトルがあります。それぞれの長さは 600 万から 700 万です。それらは、ラベルの文字 (文字) を持つ数値データまたは因子データのいずれかです。レベルが設定され、すべての因子で、すべてにいくつかの NA があります。例として

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

vecA を数値に強制し、vecB を因数分解する効率的な方法はありますか。問題は、数値ベクトルと因子ベクトルがデータのどこにあるのかわからず、それらを 1 つずつ調べていくのが面倒なことです。

4

2 に答える 2

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
于 2012-08-24T21:44:53.500 に答える
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)
于 2012-08-24T21:43:09.427 に答える