优化:在R或SQLite中将一列拆分为四列

ef1yzkbh  于 2023-02-05  发布在  SQLite
关注(0)|答案(2)|浏览(195)

我需要从一个非常大的数据集中分析数据,为此,我需要将一个字符变量分成一千多列。
此变量的结构为:

number$number$number$ and so on for a thousand numbers

我的数据存储在SQLite的. db文件中,然后我使用"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)?
谢谢。

pwuypxnk

pwuypxnk1#

您可以使用tidyfast软件包(see here),该软件包利用data.table。在此测试中,它的速度大约是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年2月3日,使用reprex v2.0.2

iq0todco

iq0todco2#

您可以尝试按原样写入该文件,然后尝试使用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
)

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

相关问题