如何使用更快的方式处理和组合列表中的数据帧
最后,我遇到了一个问题,那个数据处理非常缓慢,并附加了多个data.frames
的行。我使用lapply
和dplyr
组合进行数据处理。 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” ... depends on how much left in my ram. I have 8 Gb ram but seems still struggling;(
我也试过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]
适合我开始!非常感谢! – Alexander
从plyr
包使用ldply
将不再需要绑定列表后处理,因为它会输出一个数据。框架
library(tidyr)
library(dplyr)
library(plyr)
files <- list.files("file_directory", pattern = "w.*.csv", recursive = TRUE, full.names = TRUE)
data<- ldply(files, function(x){
read.table(file=x, sep=',', header = TRUE, fill = FALSE, skip = 0, stringsAsFactors = FALSE, 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)
})
谢谢你。我会比较速度并在这里尽快反馈结果! – Alexander
如果文件很大,通常'data.table'会运行得更快,但'ldply'有'.parallel'选项,读取大量文件时速度提高了50%。 – manotheshark
谢谢你!我会记住这一点! – Alexander
尝试使用data.table函数(fread,更新引用等)。我还建议阅读这些文件,不要进一步操作,然后用id绑定,然后运行分析一次,按“BC”和新文件ID分组。 –
@ r2evans感谢您的评论。你是什么意思'从不使用它'我认为'%>%'操作符在读取'select'函数后传递列表中的每个文件? – Alexander
你有错误吗?警告?你有什么迹象表明事情不对?您需要提供更多信息。 (你也应该包括所有正在使用的软件包,可能至少包括'dplyr'和'tidyr'。) – r2evans