2016-04-06 60 views
0

我想通过读取一个csv文件中的每一天来构造一个数据框。我的每日csv文件包含相同行数的字符,双精度和整数列。我知道任何给定月份的最大行数,并且每个csv文件的列数保持不变。我环路通过与fileListing,其中包含csv文件名列表中选择一个月份的每一天(比方说,一月份):从read.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 ]] 
     } 
} 

对不起,已经修订我的问题,我想通了,它(杜)的一部分,但是我应该使用rbind逐步在数据框的底部插入数据,还是很慢?

谢谢。

BSL

+0

你可能最好将它们全部读入列表中,并使用'do.call(rbind.data.frame,data)'将它们一次全部组合。 –

回答

1

如果数据是相对于你的可用内存非常小,只是读取的数据,并且不担心。读完所有数据并完成一些清理后,使用save()保存文件,并使用load()在该文件中读取分析脚本。从分析剪辑中分离读取/清除脚本是减少此问题的好方法。

加快读取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

+0

我想到了这一步,但我仍然希望编写每日文件的月度集合,以便将第二天附加到月度数据框中的第一天数据的底部。 谢谢。 –

+0

对colClass和nrow参数进行一些编辑。这些将有助于读取时间和内存使用情况。在适度大小的数据集上使用rbind将会很快。 – lmo

1

你可以阅读他们与lapply列表,然后立刻将它们组合起来的所有:

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

首先定义一个主数据帧来保存所有的数据。然后在读取每个文件时,将数据附加到主文件中。

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