【发布时间】:2020-09-09 23:16:20
【问题描述】:
我想读入具有不同列号和名称的多个 CSV 文件并将它们绑定在一起。当所有文件具有相同的列数时,我知道如何执行此操作,但我在列数不同的情况下遇到了困难。
我在文件中发现了一种模式,可以帮助我完成我的流程。我基本上想跳过前 2 列,保留第 3 列,跳过接下来的 2 列,保留接下来的 8 列,然后跳过任何后续列。
这是读取所有文件的功能。我想忽略标题,因为列名不同,并且我使用 col 类删除我不想要的列。我也只指定我想要 1-18 行。我将 csv 文件的路径添加为列名,以识别它来自哪个文件。
read_fun = function(path){
test = read.csv(path, sep=",", header=F, fill = TRUE, colClasses = c(rep("NULL",2), "character",rep("NULL",2),
rep("character",8), rep("NULL",5)),
skip = 1, nrows = 17)
test$question = path
test
}
然后我使用 map 对所有文件进行行绑定。
FileList = list.files(pattern = "*.csv",
full.names=FALSE,recursive = T)
# read_fun(allfiles[1])
combined_dat <- map_dfr(allfiles,read_fun)
****编辑:我确实得到了我正在寻找的组合文件,但有一个例外;绑定新文件时,(某些文件的)某些行会附加到新列, 当我运行 map_dfr 时出现此警告:
New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
* ...
New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
* ...
New names:
* `` -> ...9
New names:
* `` -> ...7
* `` -> ...8
* `` -> ...9
New names:
* `` -> ...4
* `` -> ...5
* `` -> ...6
* `` -> ...7
* `` -> ...8
* ...
这会产生大约 11 个无意义的变量,使数据变得毫无意义。行绑定未按预期工作。 我的怀疑是 map_dfr 不知道如何处理这种数据。
当我读入没有指定最大列数的文件时出现此错误(某些文件中有 18 列,其他文件中有 15 列)。这在技术上应该不是问题,因为如果我通过 col 类指定 18 列,它应该只是将额外的列读取为空白,这很好。
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, :
cols = 18 != length(data) = 16
很抱歉,我不知道如何重现此问题。如果您有任何建议,我将非常感激!
【问题讨论】:
-
不看数据很难评估。我会首先识别有问题的 csv,然后在文本编辑器中检查它们(如果可能的话),以确保它们具有一致的格式。
-
由于列数不一致,我会尝试使用
read.csv语句读取所有列,然后使用test[ ,c(3, 6:13)]选择所需的列如果这不是快速修复那么尝试遵循 at80 的建议。
标签: r dictionary dplyr tidyverse read.csv