簡體   English   中英

識別並轉換為數字/整數

[英]Identify and Convert to Numeric/Integer

我有一種情況需要查看字符數據,然后轉換為數字或整數。 我需要在data.table上執行此操作,並且必須如此之快,以至於在處理具有約1000列和1e6行的data.table時,請注意。 有很多丟失或稀疏的數據,這是一個令人困惑的元素。

data.table包中獲取fread可以非常迅速地完成此操作,並且可以通過csv文件進行良好測試(其他選項除外)。

有沒有一種方法可以將fread使用的列標識應用於現有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測試列中的alpha和文字. 然后編寫一個簡短的函數以應用確定的as.*

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

在我的機器上運行大約3.5秒,但是只有7列。

由user20650提供。 答案是type.convert

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM