sqlite 如何加速将一列拆分为多列?

ecbunoof  于 2023-06-23  发布在  SQLite
关注(0)|答案(2)|浏览(298)

我需要分析一个大数据集。为此,我需要将一个字符变量分成一千多列。这个变量的结构是number$number$number$ and so on for a thousand numbers
我的数据存储在SQLite数据库中。我使用RSQLite在R中导入了它。我尝试使用dplyr将此列拆分为多个列:

#d is a data.table with my data

d2=d %>% separate(column_to_separate, paste0("S",c(1:number_of_final_columns)))

它工作,但需要永远。如何更快地拆分此列(在R中或使用SQLite)?

slhcrj9b

slhcrj9b1#

您可以使用tidyfast包(see here),它利用了data.table。在这个测试中,它大约快三倍:

test <- data.frame(
  long.var = rep(paste0("V", 1:1000, "$", collapse = ""), 1000)
)
system.time({
  test |> 
    tidyr::separate(long.var, into = paste0("N", 1:1001), sep="\\$")
})
#>    user  system elapsed 
#>   0.352   0.012   0.365

system.time({
  test |> 
    tidyfast::dt_separate(long.var, into = paste0("N", 1:1001), sep="\\$")
})
#>    user  system elapsed 
#>   0.117   0.000   0.118

创建于2023-02-03使用reprex v2.0.2

zzzyeukh

zzzyeukh2#

您可以尝试按原样编写文件,然后尝试使用fread加载它,这通常相当快。

library(data.table)
library(dplyr)
library(tidyr)

# Prepare example
x <- matrix(rnorm(1000*10000), ncol = 1000)
dta <- data.frame(value = apply(x, 1, function(x) paste0(x, collapse = "$")))

# Run benchmark
microbenchmark::microbenchmark({
    dta_2 <- dta %>%
      separate(col = value, sep = "\\$", into = paste0("col_", 1:1000))
  },
  {
    tmp_file <- tempfile()
    fwrite(dta, tmp_file)
    dta_3 <- fread(tmp_file, sep = "$", header = FALSE)
  }, times = 3
)

编辑:我测试了速度,它似乎比tidyfast的dt_separate快,但这取决于你的数据集的大小。

相关问题