如果您熟悉 data.table
包,那么最简单和最快的方法是这样的(未经过测试):
require(data.table)
in_pth <- "path_to_csv_files" # directory where CSV files are located, not the files.
files <- list.files(in_pth, full.names=TRUE, recursive=FALSE, pattern="\\.csv$")
out <- rbindlist(lapply(files, fread))
list.files
参数:full.names = TRUE
会返回文件的全路径。假设你的in_pth <- "c:\\my_csv_folder"
,在里面有两个文件:01.csv 和 02.csv
。那么,full.names=TRUE
将返回 c:\\my_csv_folder\\01.csv
和 c:\\my_csv_folder\\02.csv
(完整路径)。
recursive = FALSE
不会搜索in_pth
文件夹中的目录。假设你在 c:\\my_csv_folder\\another_folder
中有两个csv文件。现在,如果你想把这些文件加载到这一个文件中,那么你可以设置 recursive=TRUE
,这将扫描文件,直到你搜索到所有目录为止。
pattern=\\.csv$
:这是一个正则表达式,用于指定要加载哪种类型的文件。如果你的文件夹除了csv文件还有文本文件(.txt),那么通过指定这个模式,你只会加载csv文件。如果你的文件夹只有CSV文件,则不需要这样做。
rbindlist
通过保留之前数据表的名称来避免列名冲突。也就是说,如果你有两个 data.table
,dt1、dt2
,它们的列名分别为x,y
和a,b
,那么做rbindlist(dt1,dt2)
将会把 a,b
改成 x,y
,而 rbindlist(dt2, dt1)
则会把 x,y
改成 a,b
。
fread
通常会自动处理列、头、分隔符等,并且速度非常快(虽然仍处于试验阶段,所以你可能需要检查输出以确保一切都很好(即使是稳定的))。
@ Denis: 这个也值得研究一下 plyr
包。使用 rbind.fill(...)
可以按行合并数据框。
install.packages("plyr")
library(plyr)
help (rbind.fill)
命令会给你以下信息:
rbinds
是一个数据框列表,可以用 NA 填充缺失的列。
使用方法:
rbind.fill(...)
Arguments
...
将输入的数据框按行绑定在一起。第一个参数可以是数据框列表,此时所有其他参数都将被忽略。
详细信息
这是对rbind
的增强,它添加了不在所有输入中出现的列,接受数据框列表,并且操作速度大大提高。
输出中的列名和类型将按照它们遇到的顺序出现。不执行任何检查以确保每个输入中的列具有一致的类型。
据我所知,没有cbind.fill
;但是,有用户函数cbind.fill
,允许您按列组合数据框。详情请参见此处。
有两种解决方案:一种依赖于plyr包
中的rbind.fill
,另一种与rbind.fill
无关。
install.packages("data.table")
- Arundata.table
吗?然后通过执行require(data.table)
命令加载了该包吗?它是否成功加载? - Arun