首页 > 解决方案 > 在 data.table 中查找与表头相同的行

问题描述

我正在阅读一个巨大的 csv 文件fread。数据格式不正确,并且标题不时重复。我现在想删除文件中的标题,因此,我必须搜索内容等于标题的行。

我可以想到 2 个解决方案,但都不是最优的:

  1. 选项 1 假设所有非标题重复行至少在一个位置上相互不同
  2. 选项 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])]

标签: rdata.tablefread

解决方案


反加入:

setkeyv(foo, names(foo)) # Reordes data though
foo[!list(names(foo))]

   a b
1: 1 a
2: 1 b
3: 2 a
4: 2 b

不设置键:

nfoo <- names(foo)
foo[!setNames(as.list(nfoo), nfoo), on = nfoo]

推荐阅读