Адресация столбцов data.table на основе двух команд grep () в R - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь найти строки на основе двух условий в data.table. Этими двумя условиями являются наличие определенных слов в длинной строке. Минимальный пример выглядит следующим образом:

library("data.table")
dt <- data.table(var1 = c("abc","adb","acf"))

, и теперь я пытаюсь найти элементы 1 и 2, ища "a" и "b", появляющиеся вместе в той же записи var1. В действительности таблица данных содержит несколько сотен тысяч записей, а строки представляют собой длинные формулы, в которых я ищу многосимвольные слова. Вот моя попытка:

dt[grep("a", var1) & grep("b", var1)]

, который выдает предупреждение:

In grep("a", var1) & grep("b", var1) :
longer object length is not a multiple of shorter object length

, который выглядит как data.table, что-то делает последовательно? На мой взгляд, это должно быть то же самое, что и dt[var1 == X & var2 == Y], который будет работать ... Любая помощь приветствуется!

пс: Для полноты здесь приведено предупреждение о моих фактических данных, которые, я надеюсь, имеют то же происхождение (иначе мой пример - мусор):

Error in `[.data.table`(collected, grep(pairs[i, 1], model_formula) &  : 
i evaluates to a logical vector length 423098 but there are 3980284 rows. 
Recycling of logical i is no longer allowed as it hides more bugs than is 
worth the rare convenience. Explicitly use rep(...,length=.N) if you 
really need to recycle.
In addition: Warning message:
In grep(pairs[i, 1], model_formula) & grep(pairs[i, 2], model_formula) :
longer object length is not a multiple of shorter object length

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Третий вариант, основанный на intersect():

dt[intersect(grep("a", var1), grep("b", var1))]
1 голос
/ 30 октября 2019

замените grep на grepl, и оно должно работать нормально ... или настройте регулярное выражение, как описано в комментариях.

dt[grepl("a", var1) & grepl("b", var1)]

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