【发布时间】:2020-07-08 01:46:07
【问题描述】:
我正在阅读带有 fread 的巨大 csv 文件。数据格式不正确,并且标题不时重复。我现在想删除文件中的标题,因此,我必须搜索内容等于标题的行。
我可以想到两种解决方案,但都不是最优的:
- 选项 1 假定所有非标题重复行至少在一个位置上相互不同
- 选项 2 非常冗长,需要大量写作
基本上我需要一种循环遍历所有列并将它们与标题进行比较。
因此,整个事情归结为一个问题:
如何在数据表中找到特定行无需硬编码过滤器?
代码
library(data.table)
foo <- data.frame(a = c(1:2, "a", 1:2, "a"), b = c(letters[1:2], "b", letters[2:1], "b"),
stringsAsFactors = FALSE)
setDT(foo)
## option 1: use duplicates, assuming that each row is otherwise unique
foo[-(which(duplicated(rbind(as.list(names(foo)), foo))) - 1)]
## option 2: compare directly, but becomes very cumbersome with growing number of columns
foo[!(a == names(foo)[1] & b == names(foo)[2])]
【问题讨论】:
-
重复的标题总是与实际的第一个标题相同?
-
据我所知是的
-
那我们只需要比较第一列,即你的选项2,但只检查第一列?或者使用 grep 删除 R 外部的标头,例如
fread("grep -v myCol1 myfile.txt")? -
有趣的想法。我还考虑了外部 R 选项,但对于可重复性和文档,我希望在 R 中完成所有事情。只查看第一个(几个)标题是有趣和聪明的,并且肯定适用于现有的数据。
-
@thothal 有一种方法可以在 R 中传递这样的命令,正如 zx8754 所示
标签: r data.table fread