R 标识并转换为数字/整数

R 标识并转换为数字/整数,r,data.table,R,Data.table,在这种情况下,我需要查看字符数据,并将其转换为数字或整数。我需要在data.table上执行此操作,并且在使用具有1000列和1e6行的data.table时,它必须是我不注意的。有很多缺失或稀疏的数据,这是一个令人困惑的因素 fread来自data.table软件包,速度非常快,并且通过csv文件(以及其他选项)进行了良好测试 是否有方法将fread中使用的列标识应用于现有的数据。表 否则,以下是我正在考虑的方法(仍然太慢): 虚拟数据: library(data.table) size =

在这种情况下,我需要查看字符数据,并将其转换为数字或整数。我需要在data.table上执行此操作,并且在使用具有1000列和1e6行的data.table时,它必须是我不注意的。有很多缺失或稀疏的数据,这是一个令人困惑的因素

fread
来自
data.table
软件包,速度非常快,并且通过csv文件(以及其他选项)进行了良好测试

是否有方法将
fread
中使用的列标识应用于现有的
数据。表

否则,以下是我正在考虑的方法(仍然太慢):

虚拟数据:

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)
system.time(源(“https://gist.githubusercontent.com/1beb/183511b51d615751860204344a02c799/raw/91fcee73f24596ac6bdec00edaad944b5b1b7713/quick_convert.R)


在我的机器上以大约3.5秒的速度运行,但只有7列。

由user20650提供。答案是
type.convert

type.convert
在这里可能有用
system.time(对于(j in names(dt)set(dt,j=j,value=type.convert(dt[[j]]))
0.79秒。不错。应该是答案!
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[]
}