如何找到列中的所有组合并计算数据中的出现次数

时间:2019-05-29 09:12:19

标签: r count combinations

我正在尝试在第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 个答案:

答案 0 :(得分:5)

如果我对您的理解正确,则需要group_by PersonIDpaste分组中的所有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

答案 1 :(得分:0)

使用data.table

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

数据

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))