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

У меня есть набор строк и столбцов данных сообщений и комментариев на Reddit, где строка представляет сообщение и его комментарий. Поскольку одно сообщение может содержать несколько комментариев, у меня есть строки с одинаковым идентификатором (идентификатором сообщения) и разными идентификаторами комментариев. Я хочу объединить строки с одним и тем же идентификатором для одной строки и иметь все разные идентификаторы комментариев в столбце — «идентификатор комментария», разделенные запятыми. Но также, поскольку данные сообщения (заголовок, тело и т. д.) дублируются (как показано на прикрепленном изображении), мне не нужно, чтобы они объединялись, так как только одно вхождение в строке.

![дублировать строки][1] 1

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

all_reddits <- all_posts_and_comments %>%
  group_by(id) %>%
  summarise(
    comment_id = paste(comment_id, collapse=","),
    comment_author = paste(comment_author, collapse = ","),
    comment_body = paste(comment_body, collapse = ","),
    comment_score = paste(comment_score, collapse = ","),
    comment_created_date = paste(comment_created_date, collapse = ","),
    comment_link = paste(comment_link, collapse=",")
  )

Я пробовал summarise_all() и summarise_at() из R: dplyr, но я продолжаю получать ошибки.


person Nez    schedule 19.10.2019    source источник


Ответы (1)


Я считаю, что вы можете просто использовать сводную инструкцию, такую ​​как post_datapoint_xyz = first(post_datapoint_xyz), для каждого из столбцов post для решения вашей проблемы.

Также работает простое включение всех столбцов post в ваш список group_by :)
// update: вы можете сделать это быстро, написав это как

all_reddits <- all_posts_and_comments %>%
  group_by_at(vars(starts_with('post_'))) %>%
  summarise(...)

summarise_all или summarise_at здесь далеко не уйдут, так как вы хотите применить две разные функции (вставить и сначала) к двум разным группам переменных (комментариям и сообщениям), а две функции summarise_* этого не поддерживают.
Есть куча предложений в этой ветке, но они могут быть излишними для вашего использования -кейс...


Тем не менее, на заметку: вы, возможно, не сделаете себе большую пользу, просто объединив каждый столбец комментариев по отдельности, поскольку при этом вы теряете связь между ними. (представьте, что один из комментариев содержит запятую, вы не сможете отменить это резюме.)

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

// обновление: если вы хотите сделать это, вы можете использовать функция вложения, например так:

all_reddits <- all_posts_and_comments %>%
  nest(starts_with('comment_'), .key = 'comments')

Если позже вы захотите удалить эти комментарии, вам может помочь функция unnest.

all_posts_and_comments.2 <- all_reddits %>%
  unnest(comments)
person alex_jwb90    schedule 19.10.2019
comment
Благодарю вас! Я попробовал это, и это работает, я получаю вывод, как я хотел. Кроме того, что касается второго пункта, который вы упомянули, да, это правда! Но не могли бы вы привести пример того, как это сделать? Я новичок в R и не мог найти то, что вы говорите. - person Nez; 20.10.2019
comment
Эй, Нез, рад это слышать. Я добавил два обновления в свой ответ, чтобы помочь вам в этом :) Мое общее предложение состояло бы в том, чтобы разделить данные на один фрейм данных, содержащий информацию о публикации, и отдельный фрейм данных, содержащий комментарии со ссылкой на post_id, но если вы действительно хотите иметь все в одном, тогда функция nest должна помочь вам. - person alex_jwb90; 21.10.2019