文字データを見て、数値または整数に変換する必要がある状況があります。私はdata.table上でこの操作を実行する必要があり、〜1000列と1e6行を持つdata.tableで作業するときは、そのような注意を払う必要はありません。欠けている、または疎なデータがたくさんあるので、混乱する要素です。数値/整数に変換して変換する
fread
data.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"))
。
です。ここでは、type.convertは役に立ちます。 – user20650
'system.time(for(dt、j = j、value = type.convert(dt [[j]] ))) '0.79秒。悪くない。 –