5

我有 20 个不同的 .csv 文件,我需要一些如何在 R 中堆叠数据,以便我可以全面了解数据。目前我正在复制和粘贴 excel 中的列以制作一个大数据集。但是,我确信在 R 中有一种更快、更有效的方法,因为这最终需要一段时间。

此外,更糟糕的是,每个数据集中的一些变量名称并不相同。例如 VARIABLE1 在某些数据集中写为 variable1。我将如何在 R 中纠正这一点,因为我知道 R 区分大小写?

任何帮助将不胜感激。谢谢!

4

3 回答 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 and 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. 现在,如果你想在这个文件中加载这些文件,那么你可以设置recursive=TRUE,它将扫描文件,直到你找到所有目录搜索下来。

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


数据表功能:

  • rbindlist通过保留前一个 data.table 的名称来避免列名冲突。也就是说,如果您有两个data.tables分别dt1, dt2具有列名x,ya,b,那么 doingrbindlist(dt1,dt2)将负责更改a,bx,y并将rbindlist(dt2, dt1)负责更改x,ya,b

  • fread最常自动处理列、标题分隔符等。而且速度非常快(尽管仍处于试验阶段,因此您可能需要检查输出以确保一切正常(即使稳定))。

于 2013-06-24T09:54:13.017 回答
0

@Denis:同样值得研究一下plyr包装。rbind.fill(...) 允许您按行组合 data.frames。

install.packages("plyr")
library(plyr)

help (rbind.fill)详细信息为您提供以下内容:

rbinds用 NA 填充缺失列的数据框列表。

用法

rbind.fill(...) 论据

...输入数据帧到行绑定在一起。第一个参数可以是数据框列表,在这种情况下,所有其他参数都将被忽略。

细节

rbind这是对所有输入中不存在的列添加的增强,接受数据帧列表,并且运行速度大大加快。

输出中的列名和类型将按照它们出现的顺序出现。不执行检查以确保输入中的每一列都具有一致的类型。

据我所知,没有cbind.fill;但是,有一个用户功能cbind.fill允许您按列组合 data.frames。详情在这里

有两种解决方案:一种依赖于rbind.fillplyr package另一种独立于rbind.fill

于 2013-06-24T13:10:30.250 回答
-1

另一种不使用外部包的方法是使用 cbind() 命令:它对每列进行绑定。所以如果你有不同的表,你可以将它们作为参数传递给 cbind(),它们将被附加

于 2013-06-24T10:16:43.477 回答