data.table相关中的动态列名称

时间:2015-11-02 21:14:01

标签: r dataframe data.table correlation

我已将每个用户和项目(针对推荐系统)的输出组合到所有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的基本子集时取得了一些成功,但没有使用我需要的相关语法......

非常感谢任何帮助!

谢谢, 安德鲁

1 个答案:

答案 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功能。