如何在R中堆叠数据?

5
我有20个不同的.csv文件,需要在R中将数据堆叠起来,以便获取整体数据图。 目前,我正在复制和粘贴Excel中的列以制作一个大数据集。 然而,我相信在R中有一种更快,更有效的方法来完成这项工作,因为这最终需要一些时间。 此外,更糟糕的是,在某些数据集中,某些变量名并不相同。 例如,VARIABLE1在某些数据集中被写成variable1。我该如何在R中纠正这个问题,因为我知道R对大小写敏感? 非常感谢任何帮助!谢谢!
3个回答

3

如果您熟悉 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.csvc:\\my_csv_folder\\02.csv (完整路径)。

  • recursive = FALSE 不会搜索in_pth文件夹中的目录。假设你在 c:\\my_csv_folder\\another_folder 中有两个csv文件。现在,如果你想把这些文件加载到这一个文件中,那么你可以设置 recursive=TRUE,这将扫描文件,直到你搜索到所有目录为止。

  • pattern=\\.csv$:这是一个正则表达式,用于指定要加载哪种类型的文件。如果你的文件夹除了csv文件还有文本文件(.txt),那么通过指定这个模式,你只会加载csv文件。如果你的文件夹只有CSV文件,则不需要这样做。


data.table 函数:

  • rbindlist 通过保留之前数据表的名称来避免列名冲突。也就是说,如果你有两个 data.tabledt1、dt2,它们的列名分别为x,ya,b,那么做rbindlist(dt1,dt2) 将会把 a,b 改成 x,y,而 rbindlist(dt2, dt1) 则会把 x,y 改成 a,b

  • fread 通常会自动处理列、头、分隔符等,并且速度非常快(虽然仍处于试验阶段,所以你可能需要检查输出以确保一切都很好(即使是稳定的))。


谢谢!“path_to_csv_files”是指“C:\ MyFile.CSV”之类的吗?那么,.csv文件在哪里?另外,您能解释一下list.file的参数吗?抱歉,我对R相对较新。 - REnthusiast
非常抱歉,但当我输入require(data.table)时,它显示没有名为"data.table"的包?我需要在某个地方下载这个包吗? - REnthusiast
install.packages("data.table") - Arun
1
非常抱歉,Arun。但是当我尝试运行它时,它显示“错误:找不到函数'rbindlist'”?它不应该已经作为软件包的一部分安装了吗?或者有没有其他函数可以代替它? - REnthusiast
你成功安装了 data.table 吗?然后通过执行 require(data.table) 命令加载了该包吗?它是否成功加载? - Arun

0

@ 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无关。


-1
另一种方法,不使用外部包,是使用cbind()命令:它按列绑定。因此,如果您有两个不同的表格,只需将它们作为参数传递给cbind(),它们将被附加在一起。

如果你能发布答案(而不仅仅是解决方法),那就太好了。 - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接