Объединение строк списков (или длинных строк) по группам в R

#r #string #group-by #paste

Вопрос:

У меня есть фрейм данных df с областями исследований и идентификаторами журналов (ISSN). Каждый ISSN появляется несколько раз в кадре данных, и соответствующие поля могут содержать одну и ту же последовательность ключевых слов, перекрывающихся или совершенно разных, например, для одного и того же ISSN, одним может быть «искусственный интеллект, мягкие вычисления», другим может быть «облачные вычисления, мягкие вычисления, беспилотные летательные аппараты», а третьим может быть «генетические алгоритмы, ЭНН». Однако внутри строки нет повторения терминов (например, «искусственный интеллект, мягкие вычисления, искусственный интеллект»).

Вот показательный пример данных:

 dput(ptotal)
structure(list(Fields = list("inteligencia artificial, HCI, Bioinformatics", 
    "inteligencia artificial, BioinspiredAlgorithms", "advancedMachineLearning", 
    "advancedMachineLearning, Classification, Clustering", "advancedMachineLearning, applied artificial intelligence", 
    "inteligencia artificial, advancedMachineLearning, engineering"), 
    ISSN = c("19883064", "19883064", "13704621", "09574174", 
    "09574174", "09574174"), ExpectedResults = list("inteligencia artificial, HCI, Bioinformatics inteligencia artificial, BioinspiredAlgorithms", 
        "inteligencia artificial, HCI, Bioinformatics inteligencia artificial, BioinspiredAlgorithms", 
        "advancedMachineLearning", "advancedMachineLearning, Classification, Clustering advancedMachineLearning, applied artificial intelligence inteligencia artificial, advancedMachineLearning, engineering", 
        "advancedMachineLearning, Classification, Clustering advancedMachineLearning, applied artificial intelligence inteligencia artificial, advancedMachineLearning, engineering", 
        "advancedMachineLearning, Classification, Clustering advancedMachineLearning, applied artificial intelligence inteligencia artificial, advancedMachineLearning, engineering")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(1L, 35L, 4L, 10L, 20L, 39L
))

 

Исходными данными будут первые два столбца (Поля и ISSN), а последний будет моим ожидаемым результатом (я просто склеил все строки в строках, которые имеют один и тот же ISSN). Вы можете видеть, что если термин появляется несколько раз в разных строках для одного и того же ISSN, он несколько раз вставляется в столбец Ожидаемые результаты.

Моя конечная цель-объединить все строки, соответствующие одному и тому же ISSN, в одну строку. После этого я планирую найти уникальные термины в строке и подсчитать, сколько раз каждый термин повторяется в объединенной строке (tf), чтобы у меня было представление о том, о чем на самом деле журнал. Проблема в том, что мне не удается склеить строки вместе (по группам).

Я видел несколько подобных сообщений здесь в переполнении стека для числовых столбцов, а также для столбцов с одним символом/словом (которые я пробовал), но до сих пор ни один из них, похоже, не работает (я в основном пробовал с plyr и dplyr). В опубликованном примере я просто использовал вставку, чтобы вручную соединить строки, поэтому я предполагаю, что решение довольно простое, и я просто что-то неправильно кодирую.

Может ли кто-нибудь указать на соответствующий пост или предложить решение? Заранее спасибо!

Комментарии:

1. Ваши данные не содержат дубликатов ISSN, и большинство ваших Fields данных являются инвариантными. Я уверен, что эта задача решается прямолинейно на любом диалекте R , который вы предпочитаете (базовый dplyr , или data.table ), но вы должны задать минимальный рабочий и репрезентативный вопрос. В этом случае я предлагаю вам сократить ваши поля до 2-3 в строке, убедиться, что у вас действительно есть хотя бы один дубликат ISSN (но не все дубликаты, наличие одиночек тоже хорошо), и продемонстрировать ожидаемый результат (по крайней мере, для одного из обманутых).

2. Выполнено. Спасибо за обратную связь

3. Разгадал ее! group_by не работал, потому что я загружал plyr после dplyr. Я удалил plyr и теперь получаю ожидаемый результат. Я приношу извинения за доставленные хлопоты.

4. Ха-ха! Да, это обычное дело. Это может быть довольно неприятно, когда функции пакета маскируют другие, и, хотя R должен предупреждать вас, когда это происходит, мне легко замаскировать это сообщение.

5. Да, я сходил с ума здесь, проверяя одни и те же строки снова и снова. Ваше предложение перейти к репрезентативному подмножеству данных помогло мне отладить и устранить проблему. Большое спасибо! 🙂