#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.00 ║ 1 ║ 111 ║ 222 ║ 3 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 1.00 ║ 1 ║ 111 ║ 333 ║ 3 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 1.00 ║ 1 ║ 333 ║ 111 ║ 6 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 1.00 ║ 2 ║ 222 ║ 111 ║ 1 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 1.00 ║ 2 ║ 222 ║ 555 ║ 4 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 1.00 ║ 2 ║ 222 ║ 444 ║ 4 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.00 ║ 3 ║ 444 ║ 222 ║ 4 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.00 ║ 3 ║ 444 ║ 777 ║ 2 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.00 ║ 3 ║ 777 ║ 444 ║ 2 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.00 ║ 3 ║ 444 ║ 333 ║ 5 ║
╠═══════╬════════╬═════════════╬════════════╬══════════════════╣
║ 2.00 ║ 3 ║ 111 ║ 777 ║ 3 ║
╚═══════╩════════╩═════════════╩════════════╩══════════════════╝
Целью является:
- Агрегирование по первому слушателю каждого потока в рамках темы относительно среднего качества ответов докладчиков (кроме ответа основного слушателя, сделанного по очереди).
Это может сбивать с толку словами; для визуализации конечный результат выглядит так:
╔═══════╦════════╦═════════════╦═════════════════╦══════════════════════════════════════════╗
║ topic ║ thread ║ listener_id ║ others_response ║ explanation ║
╠═══════╬════════╬═════════════╬═════════════════╬══════════════════════════════════════════╣
║ 1 ║ 1 ║ 111 ║ 3 ║ 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