2015-11-02 68 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