2012-08-24 22 views
5

'un verimli kullanımı Veri tabanından R'ye aktarılan birkaç yüz karakter vektörüne sahibiz - her biri 6-7 milyon uzunluğa sahiptir. Bunlar, etiketler için karakter (harfler) içeren sayısal veya faktör verileridir - ayarlanacak düzeyler, tüm faktörler, hepsinin bazı NA'ları vardır. Bir örnekas.numeric() ve factor()

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

olarak faktör için sayısal ve vecB için VECA zorlamak için etkili bir yolu var mı. Sorun, sayısal ve faktör vektörlerinin veride nerede olduğunu bilmemek ve bunları birer birer gözden geçirmek üzücü.

+0

Bu vektörlerin hepsi aynı nesnede mi, yoksa tek tek nesneler mi? Örneğinizde olduğu gibi düzenli isimleri var mı? –

+0

Her vektörü, bir veritabanından bir seferde bir işlevde arayacağım. Bu işlev paralelleştirilebilir. Bazı dizelerde özel karakterler olacak - ancak sadece faktör tipi verileri için. – Yoda

cevap

7

Herhalde sınıfına "numeric" her vektör dönüştürmek için ilk teşebbüs, tryCatch() kullanmayı tercih ediyorum. as.numeric() bir uyarı iletisi atarsa ​​(giriş vektörü sayısal olmayan karakterler içeriyorsa olduğu gibi), uyarıyı yakalar ve vektörü "factor" sınıfına dönüştürürüm.

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! Çok teşekkür ederim. – Yoda

1

Belki de düzenli bir ifade? Her vektör için, sayılara benzeyen şeylerle eşleştirin.

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

Sonra bir liste halinde vektörleri sarın ve lapply kullanın:

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

Sadece ilk 500 elemanı test etmek için daha verimli olabilir. –