【发布时间】:2020-12-29 19:55:40
【问题描述】:
我有大量文件需要读入 R,将它们放入数据框中,然后按特定列(“praacid”)拆分。计算将在集群上执行。我的代码使用较少数量的文件,但是使用所有文件时的数据量对于 R 来说太大了。
期望的输出:包含因子“pracid”的每个级别的数据集的单独文件。例如。 file1 包含 pracid==1 的所有数据,file2 包含 pracid==None 的所有数据,以此类推
data.table::rbindlist(dat) 中的错误:列表中的总行数为 3479242206,大于最大行数,当前为 21474833647。
我还必须在另一个包含更多文件的目录中工作。处理这么多数据的最有效方法是什么?
library(plyr)
library(tidyverse)
library(broom)
library(dplyr)
library(sqldf)
library(data.table)
library(stringr)
library(lubridate)
library(doParallel)
procs = as.numeric(Sys.getenv("MOAB_PROCCOUNT"))
registerDoParallel(cores=procs)
files = list.files(path = paste0(data_dir, "Consultation"), pattern = "*.txt$", full.names = T)
dat = foreach(i = files) %dopar% read.delim(i)
dat = as.data.frame(data.table::rbindlist(dat))
dat = dat %>% distinct(consid, .keep_all = TRUE) %>% arrange(pracid)
write.table(dat, file = paste0(output_dir, "consultation.txt"), sep = "\t")
# Split by practice
dat.split = as.data.table(dat)
dat.split = split(dat.split, by = c("pracid"))
for (i in 1:length(dat.split)){
write.table(dat.split[i], file=paste0(practice_dir, "Consultation/",
names(dat.split)[i], ".txt"), sep = "\t",
row.names=FALSE, col.names = colnames(dat.split[[1]]))
}
文件格式如下:
patid consid pracid staffid
50000082035 23408234 2002 12003
235235 234234 45666 209
【问题讨论】:
标签: r parallel-processing bigdata doparallel