r data.table grep ошибка с большим файлом, но не с примером - PullRequest
0 голосов
/ 05 марта 2019

Я хочу найти заданный набор столбцов в data.table для заданной строки и установить значение другого столбца в найденных строках.

Вот базовая структура, которая отлично работает с этим небольшим файлом.

dt <- structure(list(Abstract = c("RCP", "RCP8.5", "Another string"
), Author.Keywords = c("Random key words", "", "Crop system; Environmental sustainability"), RCP = c("None", "None", "None")), class = c("data.table", 
 "data.frame"), row.names = c(NA, -3L))

В таблице данных grep ищет «RCP» в столбцах Abstract и Author.Keywords и когда находитRCP, он записывает «RCP» в столбец RCP.

dt[grep("RCP", c(Abstract, Author.Keywords), perl = TRUE, ignore.case = TRUE), RCP := "RCP"]

Но у меня есть таблица данных под названием «домашний скот» с 1632 строками и 34 колонками.Это сообщение я получаю, когда пытаюсь запустить тот же код.

livestock[grep("RCP", c(Abstract, Author.Keywords), perl = TRUE, ignore.case = TRUE), RCP := "RCP"]

Error in `[.data.table`(livestock, grep("RCP", c(Abstract, Author.Keywords),  : 
  i[16] is 1825 which is out of range [1,nrow=1632]

Похоже, что мой grep-код ищет за пределами data.table, но почему?И как исправить?

Использование grepl вместо grep возвращает

Error in `[.data.table`(livestock, grepl("RCP", c(Abstract, Author.Keywords),  : 
  i evaluates to a logical vector length 3264 but there are 1632 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.

1 Ответ

0 голосов
/ 05 марта 2019

Мы указываем интересующие столбцы в .SDcols, перебираем Подмножество данных (.SD) с помощью lapply, проверяем строку "RCP" с grepl, чтобы вернуть list логических векторов, то есть Reduce d для одного логического vector с | (or)

i1 <- livestock[, Reduce("|", lapply(.SD, function(x) 
     grepl("RCP", x))), .SDcols = c("Abstract", "Author.Keywords")]

Если подстрока "RCP" должна присутствовать во всех столбцах, указанных в .SDcols, затем используйте & вместо | в Reduce

i1 <- livestock[, Reduce("&", lapply(.SD, function(x) 
     grepl("RCP", x))), .SDcols = c("Abstract", "Author.Keywords")]

Используйте логический вектор в i для подстановки строк и назначьте "RCP" для RCP столбец

livestock[i1, RCP := "RCP"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...