Найти количество комбинаций - PullRequest
1 голос
/ 17 марта 2020

У меня есть набор данных, где каждая строка соответствует образцу, который был проверен на наличие определенных c лекарств (один образец может иметь более одного лекарства). Я пытаюсь найти наиболее распространенные комбинации лекарств, и я хотел узнать, есть ли лучший способ сделать это. Это пример моего набора данных:

    id = c(id1,id2,id3,id4,id5,id6,id7,id8)
    d1 = c(1,1,0,1,0,1,0,1)
    d2 = c(0,0,1,0,1,1,1,0)
    d3 = c(1,0,1,1,0,1,0,1)

    df = tibble(id, d1, d2, d3)

столбец id соответствует идентификатору образца, а другие столбцы - лекарства, для которых был протестирован каждый образец (в исходном наборе данных у меня 42 препарата / столбцы). 1 означает Да, 0 означает Нет.

Чтобы получить количество комбинаций, я сделал следующее:

df %>% unite("tot", d1:d3, sep = "-", remove = F) %>%
  group_by(tot) %>% summarise(n = n())

# A tibble: 5 x 2
  tot       n
  <chr> <int>
1 0-1-0     2
2 0-1-1     1
3 1-0-0     1
4 1-0-1     3
5 1-1-1     1

Хорошо, теперь я знаю эту комбинацию 1-0-1 (d1 + d3 ) является наиболее распространенным. Это относительно просто, учитывая, что в примере у меня есть только 3 препарата. Проблема в том, что когда я делаю это для 42 лекарств, я получаю огромную строку, которую мне нужно перевести обратно.

Есть ли более эффективный способ сделать это? Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Используя dplyr, вы можете сделать:

df %>%
 group_by_at(vars(-id)) %>%
 count()

     d1    d2    d3     n
  <dbl> <dbl> <dbl> <int>
1     0     1     0     2
2     0     1     1     1
3     1     0     0     1
4     1     0     1     3
5     1     1     1     1

Если вы хотите, чтобы имена столбцов совпадали с n из (наиболее часто встречающихся) комбинаций, с добавлением tidyr:

df %>%
 group_by_at(vars(-id)) %>%
 count() %>%
 ungroup() %>%
 top_n(2, wt = n) %>%
 rowid_to_column() %>%
 pivot_longer(-c(rowid, n)) %>%
 group_by(rowid, n) %>%
 summarise(name = paste(name[value == 1], collapse = ", "))

  rowid     n name  
  <int> <int> <chr> 
1     1     2 d2    
2     2     3 d1, d3
1 голос
/ 17 марта 2020

дополнительная опция

df %>% 
  pivot_longer(-id) %>% 
  filter(value != 0) %>% 
  group_by(id) %>% 
  summarise(name = str_c(name, collapse = ", ")) %>% 
  group_by(name) %>% 
  count() %>% 
  arrange(-n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...