Хобрук: Ваш путь к мастерству в программировании

r ошибка data.table grep с большим файлом, но не с примером

Я хочу выполнить поиск по указанному набору столбцов в 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.
04.03.2019

  • Здесь grep применяется к нескольким столбцам. Возможно i1 <- livestock[, Reduce("|", lapply(.SD, function(x) grepl("RCP", x))), .SDcols = c("Abstract", "Author.Keywords")]; livestock[i1, RCP := "RCP"] 05.03.2019
  • Это работает, что является ключевым моментом! Но я пытаюсь понять логику. Я не использовал сокращение много. Вот моя интерпретация слов первой строки. Для каждого из столбцов SD введите поисковую фразу, затем используйте 'или' (|), чтобы установить значение i1 в TRUE, если фраза находится в одном из двух столбцов. Это верно? Как бы вы изменили это, чтобы использовать AND; т.е. фраза должна быть в обоих? 05.03.2019

Ответы:


1

Мы указываем интересующие столбцы в .SDcols, просматриваем подмножество таблицы данных (.SD) с помощью lapply, проверяем строку «RCP» с помощью grepl, чтобы вернуть list логических векторов, то есть Reduced к одному логическому 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"]
04.03.2019
  • Попытка придумать умный способ сделать все это в i удобно - может быть, dt[Reduce(`|`, lapply(mget(c("Abstract","Author.Keywords")), grepl, pattern="RCP")), RCP := "RCP"] - немного неудобно. 05.03.2019
  • Вероятно, это должен быть новый вопрос, но он имеет сходство с приведенным выше. Я хочу выбрать подмножество строк, выполнив поиск по нескольким столбцам. Определите grepString как "(?=.*Sustainable)|(?=.*SDG)". Тогда используйте этот код - temp <- dt[grep(grepString, c(Abstract, Author.Keywords), perl = TRUE, ignore.case = TRUE),]. Вроде работает, но очень медленно. Существует ли структура apply, которая будет работать? 05.03.2019
  • @JerryN Я думаю, вы можете использовать тот же синтаксис, заменив grepl("RCP" на grepl(grepString, 05.03.2019
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...