我有一个矩阵,我在R的推荐器包中用realRatingMatrix强制执行。数据包含许多产品的0-1之间的等级预测。
矩阵应包含沿行的客户编号(第2行向下),以便第1列标题为行标签,第2行以后第1行中的列为产品ID。我遇到的问题是,当我强制使用矩阵时,数据结构会变得混乱:
编辑:链接到Github存储库www.github.com/APBuchanan/recommenderlab-model
str(wsratings)
num [1:43, 1:319] 0.192 0.44 0.262 0.161 0.239 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:319] "X011211" "X014227" "X014229" "X014235" ...
第一个单元格[1,1]应标记为" CustomerNumber"第1行中的其余列应包含当前保存在上述$:chr中的数据,但应在矩阵中显示为单独的变量。
从下面的代码中你会看到我已经尝试通过将数据插入两个向量来解决这个问题,然后我可以在dimnames函数中调用它,但是我得到了错误:
setwd("location to pull in data")
#look at using XLConnect package to link straight to excel workbook
library(recommenderlab)
library(xlsx)
library(tidyr)
library(Matrix)
#library(stringer)
data=read.csv("WS1 & WS2 V3.csv",header=TRUE,row.names=1)
#remove rows where number of purchases is <10
df=data[rowSums(data[-1])>=10,]
df<-as.matrix(df)
data.matrix=as(df,"binaryRatingMatrix")
#image(data.matrix)
model=Recommender(data.matrix,method="UBCF")
predictions<-predict(model,data.matrix,n=5)
set.seed(100)
evaluation<-evaluationScheme(data.matrix,method="split",train=0.5,given=5)
Rec.ubcf <- Recommender(getData(evaluation, "train"), "UBCF")
predict.ubcf<-predict(Rec.ubcf,getData(evaluation,"known"),type="topNList")
pred.ubcfratings<-predict(Rec.ubcf,getData(evaluation,"known"),type="ratings")
error.ubcf<-calcPredictionAccuracy(predict.ubcf,getData(evaluation,"unknown"),given=5)
setwd("Location to output data from model")
wsratings<-as(pred.ubcfratings,"matrix")
ratingrows<-c(evaluation@runsTrain)
我称之为colnames2<-c(wsratings[1,2:ncol(wsratings)])
我希望第2列到最后一列的数据在第1行被读入向量。但是当我打印结果时,它还包括评级信息,这不是我之后的信息。
ratingrows<-c(evaluation@runsTrain)
包含我想在行标签下方插入的客户编号&#34; CustomerNumber&#34;。
我猜测有一种方法可以用tidyr包来解决这个问题,但不太熟悉它。如果有人能就我如何清理这一切提出一些建议,我将非常感激。
答案 0 :(得分:1)
因此,根据您提供的数据,我在这里提出了一个解决方案。
你说“我需要从测试数据分割中提取客户编号并将其放入矩阵的第一列 - 这是我的主要问题”。提取方式可以是:colnames(wsratings)
或dimnames(wsratings)[[2]]
。
一旦你有了这个向量(长度为320),你想“将它放到第一列”。您要求cbind()
,但要绑定它的数据长度包含43行。您不能将它们绑定在一起,因为两个元素的长度不是相同或彼此的倍数。
假设您有完整的数据集及其长度匹配,则代码为:
customerid <-c("CustomerName", evaluation@runsTrain[[1]])
wsratings <- cbind(customerid, wsratings)
这就是我想要的东西,它让我得到以下结论: