我有20个不同的.csv文件,我需要一些如何在R中堆叠数据,以便我可以获得数据的整体情况。 现在我正在复制并粘贴excel中的列以创建一个大数据集。 但是,我确信在R中有更快更有效的方法,因为这最终需要一段时间。
另外,为了使事情变得更糟,一些变量名在每个数据集中都不相同。 例如,VARIABLE1在某些数据集中被写为variable1。我如何在R中纠正这一点,因为我理解R是区分大小写的?
非常感谢任何帮助。谢谢!
答案 0 :(得分: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.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的名称来避免列名冲突。也就是说,如果您分别有两个data.table
dt1, dt2
列名为x,y
和a,b
,那么执行rbindlist(dt1,dt2)
将会更改{{1} } a,b
和x,y
会将rbindlist(dt2, dt1)
更改为x,y
。
a,b
最常自动处理列,标题分隔符等等。并且非常快(虽然仍然是实验性的,所以您可能需要检查输出以确保它一切正常(即使稳定))。
答案 1 :(得分: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。详情here。
有两种解决方案:一种取决于rbind.fill
中的plyr package
,另一种取决于rbind.fill
。
答案 2 :(得分:-1)
另一种方法,不使用外部包,就是使用cbind()命令:它使每列绑定..所以如果你有不同的表,你可以将它们作为参数传递给cbind(),它们将是所附