2016-10-15 19 views
1

文字データを見て、数値または整数に変換する必要がある状況があります。私はdata.table上でこの操作を実行する必要があり、〜1000列と1e6行を持つdata.tableで作業するときは、そのような注意を払う必要はありません。欠けている、または疎なデータがたくさんあるので、混乱する要素です。数値/整数に変換して変換する

freaddata.tableパッケージはこれを信じられないほど迅速に実行し、csvファイル(他のオプションもあります)からうまくテストされています。

freadで使用されている列IDを既存のdata.tableに適用する方法はありますか?

そうでない場合は、ここで私は(まだ遅すぎるいる)を考慮したアプローチがあります:

ダミーデータ:

library(data.table) 

size = 1e6 
resample <- function(x,size = 1e6) sample(x,size,replace = TRUE) 

text <- c("Canada","Peru","Australia", 
      "Angola","France","", NA_character_) 
text2 <- c("Oh Canada.","Arriba Peru.", 
      "Australia?","Vive la France.") 
numerics <- rnorm(1e6) 

dt <- data.table(
    id = as.character(1:1e6), 
    i1 = resample(c(as.character(c(0:5,NA)),"")), # sometimes just blank 
    i2 = resample(c(as.character(c(100:500,NA)))), 
    n1 = as.character(round(rnorm(1e6),3)), 
    t1 = resample(text), 
    t2 = resample(text2) 
) 

str(dt) 

私のアプローチはこれまでのところ、アルファの列をテストするためにgrepを使用することです、リテラル.を入力して、as.*を指定した短い関数を記述します。私のマシンではなく、唯一の7列に対して約3.5秒で実行

decide <- data.frame(
    vars = names(dt), 
    character = unlist(lapply(dt, function(x) length(grep("[a-z]",x)))), 
    numeric = unlist(lapply(dt, function(x) length(grep("[.]",x)))) 
) 

what_is_it <- function(character, numeric) { 
    if(character == 0 & numeric == 0) { 
    return("as.integer") 
    } 
    if(character > 0) { 
    return("as.character") 
    } 
    if(numeric > 0 & character == 0) { 
    return("as.numeric") 
    } 
} 

decide$fun <- apply(decide[-1], 1, function(x) what_is_it(x[1],x[2])) 

for(var in decide$vars) { 
    fun <- get(decide$fun[decide$vars == var]) 
    dt[, (var) := fun(get(var))] 
    dt[] 
} 

system.time(source("https://gist.githubusercontent.com/1beb/183511b51d615751860204344a02c799/raw/91fcee73f24596ac6bdec00edaad944b5b1b7713/quick_convert.R"))

+1

です。ここでは、type.convertは役に立ちます。 – user20650

+1

'system.time(for(dt、j = j、value = type.convert(dt [[j]] ))) '0.79秒。悪くない。 –

答えて

-1

user20650によって提供されます。答えはtype.convert