read.csv 中的数据的渐进附加

Progressive appending of data from read.csv

我想通过读取一个月中每一天的 csv 文件来构建数据框。我每天的 csv 文件包含相同行数的字符列、双精度列和整数列。我知道任何给定月份的最大行数,并且每个 csv 文件的列数保持不变。我使用 fileListing 遍历一个月的每一天,其中包含 csv 文件名列表(例如,一月):

output <- matrix(ncol=18, nrow=2976)
for ( i in 1 : length( fileListing ) ){
    df = read.csv( fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL )
    # each df is a data frame with 96 rows and 18 columns

    # now insert the data from the ith date for all its rows, appending as you go
        for ( j in 1 : 18 ){        
            output[ , j ]   = df[[ j ]]
        }
}

很抱歉修改了我的问题,因为我弄清楚了它的一部分(duh),但是我应该使用 rbind 在数据框的底部逐步插入数据,还是那样慢?

谢谢。

BSL

如果数据相对于您的可用内存而言相当小,只需读入数据即可,不要担心。在读入所有数据并进行一些清理后,使用 save() 保存文件并使用 load() 将分析脚本读入该文件。将 reading/cleaning 脚本与分析剪辑分开是减少此问题的好方法。

加快阅读 read.csv 的一项功能是使用 nrow 和 colClass 参数。既然你说你知道每个文件中的行数,那么告诉 R 这将有助于加快读取速度。您可以使用

提取列 类
colClasses <- sapply(read.csv(file, nrow=100), class)

然后将结果提供给 colClass 参数。

如果数据接近过大,您可以考虑处理单个文件并保存中间版本。站点上有很多关于管理内存的相关讨论都涵盖了这个主题。

关于内存使用技巧: Tricks to manage the available memory in an R session

关于使用垃圾收集器功能: Forcing garbage collection to run in R with the gc() command

您可以使用 lapply 将它们读入一个列表,然后一次将它们组合起来:

data <- lapply(fileListing, read.csv, header = FALSE, stringsAsFactors = FALSE, row.names = NULL)
df <- do.call(rbind.data.frame, data)

首先定义一个主数据框来保存所有数据。然后在读取每个文件时,将数据追加到母版上。

masterdf<-data.frame()
for ( i in 1 : length( fileListing ) ){
  df = read.csv( fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL )
  # each df is a data frame with 96 rows and 18 columns
  masterdf<-rbind(masterdf, df)
}

在循环结束时,masterdf 将包含所有数据。此代码代码可以改进,但对于数据集的大小,这应该足够快。