r - 如何以更快的方式处理和组合列表中的 data.frames

标签 r list dataframe dplyr data.table

最后,我遇到了一个非常缓慢的数据处理和追加多个 data.frames 行的问题。我使用 lapplydplyr 组合进行数据处理。 OTH,这个过程变得非常慢,因为我在每个数据帧中有 20000 行乘以目录中的 100 个文件。

目前,这对我来说是一个巨大的瓶颈,因为即使在 lapply 进程完成后,我也没有足够的内存来处理 bind_rows 进程。

这是我的数据处理方法,

先做一个文件列表

files <- list.files("file_directory",pattern = "w.*.csv",recursive=T,full.names = TRUE)

然后处理这个文件列表

  library(tidyr)
  library(dplyr)

data<- lapply(files,function(x){
    tmp <- read.table(file=x, sep=',', header = T,fill=F,skip=0, stringsAsFactors = F,row.names=NULL)%>%

      select(A,B, C)%>%
      unite(BC,BC,sep='_')%>%

      mutate(D=C*A)%>%
      group_by(BC)%>%
      mutate(KK=median(C,na.rm=TRUE))%>%
      select(BC,KK,D)
  })

data <- bind_rows(data)

我收到一条错误消息,

“Error: cannot allocate vector of size ... Mb” ...

取决于我的 ram 中还剩多少。我有 8 Gb 内存,但似乎仍在挣扎;(

我也试过do.call但没有任何改变!谁是我解决这个问题的友好职能或方法? 我使用 R 版本 3.4.2 和 dplyr 0.7.4。

最佳答案

我无法测试这个答案,因为没有可重现的数据,但我猜它可能像下面这样,使用 data.table:

library(data.table)

data <- setNames(lapply(files, function(x) {
  fread(x, select = c("A", "B", "C"))
}), basename(files))

data <- rbindlist(data, use.names = TRUE, fill = TRUE, id = "file_id")
data[, BC := paste(B, C, sep = "_")]
data[, D := C * A]
data[, KK := median(C, na.rm = TRUE), by = .(BC, file_id)]
data[, setdiff(names(data), c("BC", "KK", "D")) := NULL]

关于r - 如何以更快的方式处理和组合列表中的 data.frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46711824/

相关文章:

r - 从截断的正态分布中高效生成随机数

list - 谷歌翻译 - 创建白名单

python流控制功能奇怪

python - Pandas corr和corrwith非常慢

python - 根据其他行和列的多个条件在数据框中创建新列?包括空行? - python / Pandas

使用键重新映射数据库

r - 在 R 中按 NA 聚合

r - 如何去掉我的向量中的 NA

r - Packrat bootstrap 找不到 Packrat 私有(private)库

list - F# 是否有等同于 Haskell 的方法?