如何生成以全部用户为行列的用户对用户稀疏矩阵?
解决方法:生成包含全部用户的稀疏矩阵
我明白你的需求啦——原来用xtabs生成的矩阵只保留了有交互记录的用户,但你希望行列能覆盖所有存在的用户,哪怕他们没有任何交互数据。其实只要先把用户列转换成包含全部用户的因子,就能轻松解决这个问题!
具体步骤:
- 确定全部用户集合:先从你的数据里提取所有出现过的用户(不管是在U1还是U2里),或者如果你有预先定义的完整用户列表,直接用那个列表就行。
- 转换为因子类型:把
U1和U2列转换成因子,并且指定因子的水平为全部用户。这样即使某个用户在U1或U2中没有记录,也会被纳入矩阵的行列。 - 重新生成稀疏矩阵:用处理后的因子列再运行
xtabs,就能得到你想要的完整矩阵了。
完整代码示例:
# 先构造你的示例数据集 df <- data.frame( U1 = c(1, 1, 2, 3), U2 = c(3, 6, 4, 5), T = c(1, 1, 1, 1) ) # 步骤1:获取所有唯一用户(如果有预先定义的全用户列表,直接替换成这个列表即可) all_users <- unique(c(df$U1, df$U2)) # 步骤2:将U1和U2转换为包含全部用户的因子 df$U1 <- factor(df$U1, levels = all_users) df$U2 <- factor(df$U2, levels = all_users) # 步骤3:生成稀疏矩阵 trustmatrix <- xtabs(T ~ U1 + U2, df, sparse = TRUE) # 查看结果 print(trustmatrix)
输出结果:
运行后你会得到这样的矩阵,完美覆盖了所有用户(1-6),没有交互的位置自动填充0:
U2 U1 1 2 3 4 5 6 1 0 0 1 0 0 1 2 0 0 0 1 0 0 3 0 0 0 0 1 0 4 0 0 0 0 0 0 5 0 0 0 0 0 0 6 0 0 0 0 0 0
补充说明:
如果你的全部用户列表不是从数据里提取的(比如有一些用户完全没有出现在U1/U2中,但你必须包含他们),直接把all_users替换成你的完整用户列表就行,比如all_users <- c(1,2,3,4,5,6),效果是一样的。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

