Агрегирование шаблонов взаимодействия между партнерами

#r #unique #tidyverse #dplyr

#r #уникальный #tidyverse #dplyr

Вопрос:

Контекст исследования: «Слушатель» публикует свои мысли, а «говорящий» реагирует на слушателя. Первым наблюдаемым слушателем для каждого потока является автор исходного сообщения.

Пример данных:

 structure(list(topic = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2), thread = c(1, 
1, 1, 2, 2, 2, 3, 3, 3, 3, 3), listener_id = c(111, 111, 333, 
222, 222, 222, 444, 444, 777, 444, 444), speaker_id = c(222, 
333, 111, 111, 555, 444, 222, 777, 444, 333, 777), speaker_response = c(3, 
3, 6, 1, 4, 4, 4, 2, 2, 5, 3)), class = "data.frame", row.names = c(NA, 
-11L), codepage = 65001L)
 

В таблице это выглядит так:

 ╔═══════╦════════╦═════════════╦════════════╦══════════════════╗
║ topic ║ thread ║ listener_id ║ speaker_id ║ speaker_response ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0011112223        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0011113333        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0013331116        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0022221111        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0022225554        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  1.0022224444        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  2.0034442224        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  2.0034447772        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.0037774442        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.0034443335        ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║  2.0031117773        ║
╚═══════╩════════╩═════════════╩════════════╩══════════════════╝
 

Целью является:

  • Агрегирование по первому слушателю каждого потока в рамках темы относительно среднего качества ответов докладчиков (кроме ответа основного слушателя, сделанного по очереди).

Это может сбивать с толку словами; для визуализации конечный результат выглядит так:

 ╔═══════╦════════╦═════════════╦═════════════════╦══════════════════════════════════════════╗
║ topic ║ thread ║ listener_id ║ others_response ║                explanation               ║
╠═══════╬════════╬═════════════╬═════════════════╬══════════════════════════════════════════╣
║   111113        ║ Here, the first listener was 111         ║
║       ║        ║             ║                 ║ and others' average response = (3 3)/2,  ║
║       ║        ║             ║                 ║ excluding the last observation where 111 ║
║       ║        ║             ║                 ║ was the speaker.                         ║
╠═══════╬════════╬═════════════╬═════════════════╬══════════════════════════════════════════╣
║   1   ║    2   ║     222     ║        3        ║                                          ║
╠═══════╬════════╬═════════════╬═════════════════╬══════════════════════════════════════════╣
║   2   ║    3   ║     444     ║       3.5       ║ Excluding the response made by the first ║
║       ║        ║             ║                 ║ listener, the average is (4 2 5 3)/4.    ║
╚═══════╩════════╩═════════════╩═════════════════╩══════════════════════════════════════════╝
 

Ответ №1:

Вы можете удалить те ответы, значение которых speaker_id равно first listener_id и mean speaker_response для каждого topic и thread .

 library(dplyr)

df %>%
  group_by(topic, thread) %>%
  summarise(others_response = mean(speaker_response[speaker_id != first(listener_id)]), 
            listener_id = first(listener_id))

#  topic thread others_response listener_id
#  <dbl>  <dbl>           <dbl>       <dbl>
#1     1      1             3           111
#2     1      2             3           222
#3     2      3             3.5         444