Как найти все комбинации в столбце и посчитать вхождения в данных - PullRequest
3 голосов
/ 29 мая 2019

Я пытаюсь найти все фактические комбинации в моих данных значений в столбце 1.

Затем я хочу посчитать все вхождения по столбцу 2.

Такое ощущение, что R должен быть в состоянии сделать это довольно быстро. Я пытался читать на combn и expand.grid, но безуспешно. Основная проблема заключалась в том, что я не мог найти каких-либо указаний о том, как создавать комбинации в столбце.

Мои данные выглядят так:

Animal (n=57) | Person ID (n=1000)
Dog     | 0001
Cat     | 0004
Bird    | 0001
Snake   | 0002 
Spider  | 0002
Cat     | 0003
Dog     | 0004

Ожидаемый результат:

AnimalComb | CountbyID

Cat         | 1
DogBird     | 1
SnakeSpider | 1
CatDog      | 1

РЕДАКТИРОВАТЬ удалил ошибочную запись для cat

Ответы [ 2 ]

5 голосов
/ 29 мая 2019

Если я вас правильно понял, вам нужно group_by PersonID и paste всех unique Animal в группе и подсчитать количество вхождений их комбинации, которое можно сделать, считаяколичество строк в группе (n()) и деление его на количество различных значений (n_distinct).

library(dplyr)

df %>%
  group_by(PersonID) %>%
  summarise(AnimalComb = paste(unique(Animal), collapse = ""), 
            CountbyID = n() / n_distinct(Animal)) 

#  PersonID AnimalComb  CountbyID
#     <int> <chr>           <dbl>
#1        1 DogBird             1
#2        2 SnakeSpider         1
#3        3 Cat                 1
#4        4 CatDog              1
0 голосов
/ 29 мая 2019

Опция с использованием data.table

library(data.table)
setDT(df)[,  .(AnimalComb = toString(unique(Animal)),
      CountbyID = .N/uniqueN(Animal)), by = PersonID]

data

df <- structure(list(Animal = c("Dog", "Cat", "Bird", "Snake", "Spider", 
"Cat", "Dog"), PersonID = c(1L, 4L, 1L, 2L, 2L, 3L, 4L)),
 class = "data.frame", row.names = c(NA, -7L))
...