2015-11-02 93 views
0

我已将每个用户和项目(对于推荐系统)的输出组合到所有x全部R data.table中。对于此表中的每个,我需要计算用户得分1,2,3 &项目得分1,2,3之间的相关性(例如,对于第一行,0.5,0.6,-0.2和0.2之间的相关性是什么,0.8,-0.3)以查看用户和项目匹配程度。data.table关联中的动态列名称

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

看看'?melt'。 – Frank

+1

我已经翻阅了?融化,并有可能在那里有用的东西,但我仍然无法获得正确的语法。我可以得到一个单一的逻辑工作,但相关性有两组变量,我不能找出在这种情况下,= = FALSE应该去哪里 – andrewjones54

回答

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功能配合更加自然。

+0

谢谢你。我已经安装了reshape2,但得到一个错误,说它无法找到模式功能..? – andrewjones54

+0

@ andrewjones54哦,对不起,你需要加载data.table的最新版本,它将reshape2中'melt'和'dcast'的功能扩展了。根据更新日志https://github.com/Rdatatable/data.table/判断,我认为CRAN(1.9.6)的最新版本应该可以工作。 – Frank

+1

完美,谢谢 – andrewjones54