生成所有可能的对并计算R中的频率

Har*_*y M 1 r dplyr

我有一个产品(苹果,梨,香蕉)的数据框架在不同类别(食品和食品)的不同地点(城市)销售.

我想要计算任何一对产品在任何类别中出现的次数.

这是我试图使其工作的示例数据集:

category <- c('food','food','food','food','food','food','edibles','edibles','edibles','edibles', 'edibles')
location <- c('houston, TX', 'houston, TX', 'las vegas, NV', 'las vegas, NV', 'philadelphia, PA', 'philadelphia, PA', 'austin, TX', 'austin, TX', 'charlotte, NC', 'charlotte, NC', 'charlotte, NC')
item <- c('apple', 'banana', 'apple', 'pear', 'apple', 'pear', 'pear', 'apple', 'apple', 'pear', 'banana')

food_data <- data.frame(cbind(category, location, item), stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

例如,"apple&banana"对出现在"las vegas,NV"的"food"类别中,但也出现在"charlotte,NC"的"foods"类别中.因此,"苹果和香蕉"对的计数为2.

我想要的输出是这样的对数:

(无序)苹果和香蕉的数量

2

(无序)苹果和梨的数量

4

任何人都知道如何实现这一目标?相对较新的R并且已经混淆了一段时间.

我正在尝试使用它来计算不同项目之间的亲和力.

关于输出的补充说明:我的完整数据集包含数百个不同的项目.想获得一个数据框,其中第一列是该对,第二列是每对的计数.

Psi*_*dom 7

这是使用tidyverse和的一种方式crossprod; 通过使用spread,它将所有项目/水果从相同的类别 - 位置组合转换为一行,项目作为标题(这要求您在每个类别国家/地区都没有重复项目,否则您需要预先聚合步骤),值指示存在; crossprod实质上是评估项目对列的内积并给出同现数.

library(tidyverse)
food_data %>% 
    mutate(n = 1) %>% 
    spread(item, n, fill=0) %>% 
    select(-category, -location) %>% 
    {crossprod(as.matrix(.))} %>% 
    `diag<-`(0)

#       apple banana pear
#apple      0      2    4
#banana     2      0    1
#pear       4      1    0
Run Code Online (Sandbox Code Playgroud)

要将其转换为数据框:

food_data %>% 
    mutate(n = 1) %>% 
    spread(item, n, fill=0) %>% 
    select(-category, -location) %>% 
    {crossprod(as.matrix(.))} %>% 
    replace(lower.tri(., diag=T), NA) %>%
    reshape2::melt(na.rm=T) %>%
    unite('Pair', c('Var1', 'Var2'), sep=", ")

#           Pair value
#4 apple, banana     2
#7   apple, pear     4
#8  banana, pear     1
Run Code Online (Sandbox Code Playgroud)