Количество # идентификаторов, которые соответствуют обоим критериям - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть набор данных, который имеет два столбца.Один из них - идентификатор пользователя, другой - тип компании, как показано ниже:

    userid      company.type
    1               A
    2               A
    3               C
    1               B
    2               B
    3               B
    4               A

Я хочу знать, сколько существует уникальных идентификаторов пользователей, которые имеют company.type из A и B или A и C, (но не Bи C).

Я предполагаю, что это какая-то агрегатная функция, но я не уверен, как разместить классификатор для того, что company.type должен быть только A и B или A и C.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вот идея с dplyr.setequal проверяет, состоят ли два вектора из одинаковых элементов, независимо от порядка:

library(dplyr)

df %>%
  group_by(userid) %>%
  summarize(temp = setequal(company.type, c("A", "B")) |
              setequal(company.type, c("A", "C"))) %>%
  pull(temp) %>%
  sum()

# [1] 2

Данные:

df <- structure(list(userid = c(1L, 2L, 3L, 1L, 2L, 3L, 4L), company.type = c("A", 
"A", "C", "B", "B", "B", "A")), .Names = c("userid", "company.type"
), class = "data.frame", row.names = c(NA, -7L))

См .: Проверкасодержат ли два вектора одинаковые (неупорядоченные) элементы в R

0 голосов
/ 18 сентября 2018

Мы можем сделать это с base R используя table

tbl <- table(df1) > 0
sum(((tbl[, 1] & tbl[,2]) | (tbl[,1] & tbl[,3])) & (!(tbl[,2] & tbl[,3])))
#[1] 2
0 голосов
/ 18 сентября 2018

Сортируйте DF и уменьшите его до одной строки для каждого идентификатора пользователя со столбцом types, состоящим из разделенной запятыми строки типов компаний.Затем отфильтруйте его, используя указанное условие.Наконец, используйте tally, чтобы получить количество строк, оставшихся после фильтрации.Чтобы получить подробности, опустите строку tally.

library(dplyr)

DF %>% 
  arrange(userid, company.type) %>%
  group_by(userid) %>% 
  summarize(types = toString(company.type)) %>% 
  ungroup %>%
  filter(grepl("A.*B|A.*C", types) & ! grepl("B.*C", types)) %>%
  tally

, дающую:

# A tibble: 1 x 1
      n
  <int>
1     2

Примечание

Используемый ввод в воспроизводимой форме:

Lines <- "userid      company.type
    1               A
    2               A
    3               C
    1               B
    2               B
    3               B
    4               A"
DF <- read.table(text = Lines,  header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...