Найдите строку в data.table, которая совпадает с заголовком - PullRequest
2 голосов
/ 27 марта 2020

Я читаю в огромном CSV-файле с fread. Данные как-то неправильно отформатированы, и заголовок время от времени повторяется. Теперь я хочу удалить заголовки в файле, поэтому мне нужно искать строки, содержимое которых равно заголовку.

Я мог бы подумать о 2 решениях, ни одно из которых не является оптимальным:

  1. Вариант 1 предполагает, что все повторяющиеся строки без заголовка в других отношениях взаимно различны по крайней мере в одной позиции
  2. Вариант 2 очень многословен и потребует много написания

По сути, мне понадобится что-то вроде al oop с циклами во всех столбцах и сравнением их с заголовком.

Таким образом, все сводится к вопросу:

Как найти указанную c строку в таблице данных без жесткого кодирования фильтра?

код

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 ]

4 голосов
/ 27 марта 2020

Anti-join:

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]
2 голосов
/ 27 марта 2020

Поскольку неуместные заголовки повторяются так же, как и действительные заголовки, нам нужно сравнить только первый столбец, т. Е. Ваш вариант 2, но проверить только 1-й (или любой) столбец:

foo[ !(a == names(foo)[1]), ]

Или удалить Заголовки вне R, используя grep, что-то вроде:

fread("grep -v myCol1 myfile.txt")

Или вставьте каждую строку, сравните с заголовком:

foo[ do.call(paste, c(foo, list(sep = "_"))) != paste(colnames(foo), collapse = "_"), ]

Я бы предпочел go со вторым вариантом, тогда мы У нас нет проблем с классами столбцов, которые возникают у нас при использовании других решений "после фреда".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...