Как удалить всех участников в 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. Подсчитайте количество наблюдений для каждой комбинации имени пользователя / роли.
  2. Отбросьте количество наблюдений, которое имеет каждая комбинация, и подсчитайте количество ролей, которые имеет каждое имя пользователя.
  3. Ограничить имена пользователей, которые имеют только 1 роль, и вернуть вектор имен пользователей
Другие вопросы по тегам