r-生成唯一的用户项目跨产品组合矩阵



我正试图在R中创建一个唯一用户的交叉乘积矩阵。我在SO上搜索了它,但找不到我想要的东西。感谢您的帮助。我有一个大的数据帧(超过一百万),并显示了一个示例:

df <- data.frame(Products=c('Product a', 'Product b', 'Product a', 
                            'Product c', 'Product b', 'Product c'),
                 Users=c('user1', 'user1', 'user2', 'user1', 
                         'user2','user3'))

df的输出为:

   Products Users
1 Product a user1
2 Product b user1
3 Product a user2
4 Product c user1
5 Product b user2
6 Product c user3

我想看两个矩阵:第一个将显示拥有任一产品(OR)的唯一用户的数量,因此输出将类似于:

            Product a   Product b   Product c
Product a                 2            3
Product b     2                        3
Product c     3           3 

第二个矩阵将是拥有两种产品的唯一用户数量(AND):

            Product a   Product b   Product c
Product a                 2            1
Product b     2                        1
Product c     1           1 

感谢您的帮助。

感谢

更新:

这里更清楚:产品a由User1和User2使用。产品b由用户1和用户2使用,产品c由用户1与用户3使用。因此,在第一个矩阵中,乘积a和乘积b将是2,因为有2个唯一的用户。类似地,乘积a和乘积c将为3。在第二个矩阵中,它们是2和1,因为我想要交集。感谢

尝试

lst <- split(df$Users, df$Products)
ln <- length(lst)
m1 <-  matrix(0, ln,ln, dimnames=list(names(lst), names(lst)))
m1[lower.tri(m1, diag=FALSE)] <- combn(seq_along(lst), 2, 
               FUN= function(x) length(unique(unlist(lst[x]))))
m1[upper.tri(m1)] <- m1[lower.tri(m1)]
m1
#          Product a Product b Product c
#Product a         0         2         3
#Product b         2         0         3
#Product c         3         3         0

或使用outer

f1 <- function(u, v) length(unique(unlist(c(lst[[u]], lst[[v]]))))
res <- outer(seq_along(lst), seq_along(lst), FUN= Vectorize(f1)) *!diag(3)
dimnames(res) <- rep(list(names(lst)),2)
res
#          Product a Product b Product c
#Product a         0         2         3
#Product b         2         0         3
#Product c         3         3         0

对于第二种情况

tcrossprod(table(df))*!diag(3)
#            Products
#Products    Product a Product b Product c
# Product a         0         2         1
# Product b         2         0         1
# Product c         1         1         0

相关内容

  • 没有找到相关文章

最新更新