我已将每个用户和项目(针对推荐系统)的输出组合到所有x all R data.table中。对于此表中的每个行,我需要计算用户分数1,2,3和&之间的相关性。项目得分1,2,3(例如,对于第一行,0.5,0.6,-0.2和0.2,0.8之间的相关性,-0.3),以查看用户和项目的匹配程度。
user item user_score_1 user_score_2 user_score_3 item_score_1 item_score_2 item_score_3
A 1 0.5 0.6 -0.2 0.2 0.8 -0.3
A 2 0.5 0.6 -0.2 0.4 0.1 -0.8
A 3 0.5 0.6 -0.2 -0.2 -0.4 -0.1
B 1 -0.6 -0.1 0.9 0.2 0.8 -0.3
B 2 -0.6 -0.1 0.9 0.4 0.1 -0.8
B 3 -0.6 -0.1 0.9 -0.2 -0.4 -0.1
我有一个有效的解决方案 - 即:
scoresDT[, cor(c(user_score_1,user_score_2,user_score_3), c(item_score_1,item_score_2,item_score_3)), by= .(user, item)]
...其中scoresDT是我的data.table。
这一切都很好,而且很有效......但我无法使用动态变量而不是变量名中的硬编码。
通常在data.frame中我可以创建一个列表并输入它,但是因为它的字符格式,data.table不喜欢它。我尝试使用带有“with = FALSE”的列表,并在尝试data.table的基本子集时取得了一些成功,但没有使用我需要的相关语法......
非常感谢任何帮助!
谢谢, 安德鲁
答案 0 :(得分:1)
这就是我要做的事情:
mDT = melt(scoresDT,
id.vars = c("user","item"),
measure.vars = patterns("item_score_", "user_score_"),
value.name = c("item_score", "user_score")
)
mDT[, cor(item_score, user_score), by=.(user,item)]
user item V1
1: A 1 0.8955742
2: A 2 0.9367659
3: A 3 -0.8260332
4: B 1 -0.6141324
5: B 2 -0.9958706
6: B 3 0.5000000
我将数据保持在熔融/长形式,这更符合R和data.table功能。