1

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

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

4

3 回答 3

3

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

data <- lapply(fileListing, read.csv, header = FALSE, stringsAsFactors = FALSE, row.names = NULL)
df <- do.call(rbind.data.frame, data)
于 2016-04-06T20:52:41.050 回答
3

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

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 将包含所有数据。可以改进此代码代码,但对于数据集的大小,这应该足够快。

于 2016-04-06T20:53:05.487 回答
1

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

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

colClasses <- sapply(read.csv(file, nrow=100), class)

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

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

关于内存使用技巧: 在 R 会话中管理可用内存的技巧

关于使用垃圾收集器功能: 使用 gc() 命令强制垃圾收集在 R 中运行

于 2016-04-06T20:27:41.753 回答