Я хочу найти заданный набор столбцов в 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.