【发布时间】:2021-06-20 07:02:59
【问题描述】:
通常,我会被引导读取格式相同、列数相同的文件列表。 我的功能看起来像:
fun.read <- function(files) {
read <- function(filename){
DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:7, col.names = c(...))
}
lst <- lapply(files, read)
}
效果很好。
但是现在,我必须这样做,假设我的文件没有相同数量的列。 例如,我这样做的方式是:
fun.read <- function(files) {
read <- function(filename){
if (max(count.fields(filename, sep = ";")) == 7) {
DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:7, col.names = c(...))
} else if (max(count.fields(filename, sep = ";")) == 8){
DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:8, col.names = c(...))
}
}
lst <- lapply(files, read)
}
它似乎也可以正常工作,但我想知道是否没有更有效/更优雅的方式来做到这一点?
我查看了fill = TRUE 选项,但没有成功...
非常感谢!!
【问题讨论】:
-
为什么要指定
select = 1:7。如果您不指定,那么它将读取所有列。你不需要任何 if/else -
确实如此。
lapply(files, fread)似乎是合乎逻辑的答案。 -
@akrun 我认为是因为 col.names。有时它是长度为 7 的向量,有时是长度为 8 的向量。
-
@Discus23 您只需要 Oliver 指定的代码。
sep不需要,因为它会在 fread 中自动检测到 -
老实说,我还没有测试过它。但是从帮助文件中它指出它使用前几行来检测分隔符(如果我没记错的话)。除非您的数据集非常大,否则这可能只是所花费时间的一小部分。
标签: r function data.table fread