R 对非常大的文件使用ddply

R 对非常大的文件使用ddply,r,plyr,R,Plyr,我想总结一个csv文件,它的行太多,无法放入内存。这是我想做的 library(plyr) dat = read.csv("./myfile.csv",stringsAsFactors=FALSE,header = TRUE) dat2 = ddply(dat,~colA+colB,summarise,mean=mean(colC),se=sd(colC)/sqrt(length(colC))) 我可以使用readlines将代码更改为逐行读取,但在这种情况下如何使用ddply已经不清楚了。不

我想总结一个csv文件,它的行太多,无法放入内存。这是我想做的

library(plyr)
dat = read.csv("./myfile.csv",stringsAsFactors=FALSE,header = TRUE)
dat2 = ddply(dat,~colA+colB,summarise,mean=mean(colC),se=sd(colC)/sqrt(length(colC)))
我可以使用readlines将代码更改为逐行读取,但在这种情况下如何使用ddply已经不清楚了。

不使用ddply

有很多选择

将数据放入数据库,然后使用数据库RODBC/sqldf/dplyr 在R data.table中使用内存效率更高的表示形式 数据库方法。 使用sqldf创建数据库 看

使用data.table 不是用ddply

有很多选择

将数据放入数据库,然后使用数据库RODBC/sqldf/dplyr 在R data.table中使用内存效率更高的表示形式 数据库方法。 使用sqldf创建数据库 看

使用data.table
有几排?您可能希望将文件拆分为多个块,并在每个块上使用ddply。对于速度,请使用dplyr或data.table.@Frank但这些值是否正确?平均值应该是,但标准误差不会,对吗?如果块大小相同,平均值应该是正确的,但标准误差不会。如果区块大小不同,则两者都不正确。但是你可以通过跟踪sumcolC和sumcolC*colC,并在以后计算平均值和标准误差来手动解决这个问题。如果你想要速度和内存效率,不要使用plyr和ddply。它不是为此而构建的,dplyr和data.table是。有多少行?您可能希望将文件拆分为多个块,并在每个块上使用ddply。对于速度,请使用dplyr或data.table.@Frank但这些值是否正确?平均值应该是,但标准误差不会,对吗?如果块大小相同,平均值应该是正确的,但标准误差不会。如果区块大小不同,则两者都不正确。但是你可以通过跟踪sumcolC和sumcolC*colC,并在以后计算平均值和标准误差来手动解决这个问题。如果你想要速度和内存效率,不要使用plyr和ddply。它不是为此而构建的,dplyr和data.table是。谢谢,回答得很好,我发现data.table非常快。然而,也许我接受这一点有点太早了,因为所有这些程序都有一个主要缺点。具体来说,第一步是将整个文件加载到内存中,这不是一种可扩展的方法,不能用于非常大的文件。谢谢,回答得很好,我发现data.table非常快。然而,也许我接受这一点有点太早了,因为所有这些程序都有一个主要缺点。具体地说,第一步是将整个文件加载到内存中,这不是一种可伸缩的方法,不能用于非常大的文件。
library(sqldf)
# create database
sqldf("attach my_db as new")
# read data from csv directly to database
read.csv.sql("./myfile.csv", sql = "create table main.mycsv as select * from file", 
          dbname = "my_db")
# perform the query in SQL
dat2 <- sqldf("Select ColA, ColB, mean(ColC) as mean, stdev(ColC) / sqrt(count(*)) from main.mycsv", 
   dbname = "my_db")
library(dplyr)
library(RSQLite)
# reference database (created in previous example)
my_db <- src_sqlite('my_db')
# reference the table created from mycsv.csv
dat <- tbl(my_db ,"mycsv")

dat2 <- dat %>%
          group_by(ColA, ColB) %>% 
          summarize(mean = mean(ColC), se = sd(ColC) / sqrt(n()))
# fread is a fast way to read in files!
dat <- fread('./myfile.csv')
dat2 <- dat[,list(mean=mean(colC),se=sd(colC)/sqrt(.N)),by = list(ColA,ColB))