Как удалить всех участников в R, которые встречаются только с одним уровнем переменной, а не со вторым?
Я анализирую набор данных интернет-сообщества с R. Я буду очень признателен за вашу помощь, так как застрял в одной проблеме. Вот схема:
Набор данных: имя пользователя каждого пользователя доступно. Каждая строка представляет активность одного пользователя в одном онлайн-сообществе. Пример a: строка 1 показывает, что пользователь 'blue' является 'участником' интернет-сообщества x, в которое он внес один пост. Пример b: строка 5 показывает, что пользователь 'blue' также является 'владельцем' интернет-сообщества y, в которое он добавил 2 сообщения. Увидеть ниже!
Вопрос: Я хочу удалить всех пользователей из набора данных, которые активны только как участник или пользователь - в любом онлайн-сообществе. Я также хочу удалить их, если они активны в качестве участников в нескольких онлайн-сообществах. Другими словами, я хочу удалить пользователей "оранжевый", "фиолетовый", "черный" и "белый". Важно: набор данных содержит> 1 млн. строк. Я ищу подход, который принимает это во внимание:) Спасибо.
username role # of posts
blue member 1
blue member 0
red owner 6
red owner 1
blue owner 2
red member 1
blue owner 3
blue member 2
blue owner 1
blue owner 0
red member 8
green owner 1
red owner 2
red member 3
green member 4
yellow owner 5
green member 3
green owner 4
yellow owner 5
yellow member 6
yellow owner 8
*orange owner 1
orange owner 2
purple member 3
purple member 4
black owner 4
white member 4*
1 ответ
Я предполагал, что утверждение в моем комментарии было правильным.
С использованием data.table
пакет, потому что я в настроении фаната. Обратите внимание, что преобразование в таблицу данных нарушит любой синтаксис фрейма данных, который у вас будет впоследствии, поэтому, если вы пытаетесь подключить это к другому коду, вы захотите использовать setDF(users2)
потом конвертировать обратно.
library('data.table')
setDT(users)
users_to_remove <- users[, .N, .(username, role)][, .N, username][N == 1, username]
users2 <- users[!(username %in% users_to_remove)]
print(setdiff(users$username, users2$username))
Третья строка может быть немного трудной, потому что она объединяет 3 операции.
- Подсчитайте количество наблюдений для каждой комбинации имени пользователя / роли.
- Отбросьте количество наблюдений, которое имеет каждая комбинация, и подсчитайте количество ролей, которые имеет каждое имя пользователя.
- Ограничить имена пользователей, которые имеют только 1 роль, и вернуть вектор имен пользователей