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 将包含所有数据。此代码代码可以改进,但对于数据集的大小,这应该足够快。
我想通过读取一个月中每一天的 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 将包含所有数据。此代码代码可以改进,但对于数据集的大小,这应该足够快。