生成独特的用户项目叉积组合矩阵
Generate matrix of unique user-item cross-product combinations
我正在尝试在 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
我想看两个矩阵:
第一个将显示拥有任一产品(或)的唯一用户数量 - 因此输出将类似于:
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 由用户 1 和用户 2 使用。 Product b 由 User1 和 User2 使用,Product c 由 User1 和 User3 使用。因此,在第一个矩阵中,产品 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
我正在尝试在 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
我想看两个矩阵: 第一个将显示拥有任一产品(或)的唯一用户数量 - 因此输出将类似于:
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 由用户 1 和用户 2 使用。 Product b 由 User1 和 User2 使用,Product c 由 User1 和 User3 使用。因此,在第一个矩阵中,产品 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