使用 R 中一列的所有值对创建 table,计算唯一值

Create table with all pairs of values from one column in R, counting unique values

我有数据显示哪些客户购买了某些商品。他们可以多次购买一件商品。我需要的是 table 显示所有可能的成对组合的项目以及购买该组合的客户的唯一数量(table 的对角线只是人数的唯一数量购买每件商品)。

这是一个例子:

item <- c("h","h","h","j","j")
customer <- c("a","a","b","b","b")
test.data <- data.frame(item,customer)

这里是 test.data:

item customer
h    a
h    a
h    b
j    b
j    b

需要结果 - 一个 table,项目作为行名和列名,在 table 内购买该对的唯一客户计数。因此,有 2 位顾客购买了商品 h,1 位顾客同时购买了商品 h 和 j,还有 1 位顾客购买了商品 j。

item   h    j
h      2    1
j      1    1

我已经尝试使用 table 函数、melt/cast 等,但是在 table 中没有任何东西能让我得到我需要的计数。我的第一步是使用 unique() 删除重复行。

使用 data.tablegtools 包,我们可以根据客户重新创建所有可能的排列:

library(data.table)
library(gtools)

item <- c("h","h","h","j","j")
customer <- c("a","a","b","b","b")
test.data <- data.table(item,customer)

DT <- unique(test.data) #The unique is used as multiple purchases do not count twice

tuples <- function(x){
  return(data.frame(permutations(length(x), 2, x, repeats.allowed = T, set = F), stringsAsFactors = F))
}

DO <- DT[, tuples(item), by = customer]

这给出:

   customer X1 X2
1:        a  h  h
2:        b  h  h
3:        b  h  j
4:        b  j  h
5:        b  j  j

这是客户拥有的所有唯一商品配对的列表。根据您的示例,我们对待 h x j 的方式与对待 j x h 的方式不同。我们现在可以使用 table 函数获取每对的频率:

table(DO$X1,DO$X2)
    j h
  j 1 1
  h 1 2

这是一个基本的 R 解决方案:

n_intersect <- Vectorize( function(x,y) length(intersect(x,y)) )

cs_by_item <- with(test.data, tapply(customer, item, unique))

outer(cs_by_item , cs_by_item , n_intersect)
#   h j
# h 2 1
# j 1 1