首页 > 解决方案 > 将第一行(列标题)写入向量

问题描述

我有一个从 R 中推荐实验室包中的 realRatingMatrix 强制转换的矩阵。数据包含对许多产品的 0-1 之间的评级预测。

该矩阵应包含沿行(第 2 行向下)的客户编号,以便第 1 列标题为行标签,以及沿第 2 列开始的第一行列中的产品 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" ...

第一个单元格 wsratings[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)])希望将第 1 行中从第 2 列到最后一列的数据读入向量中。但是当我打印结果时,它还包括评级信息,这不是我想要的。

ratingrows<-c(evaluation@runsTrain)包含我要在行标签“CustomerNumber”下方插入的客户编号。

我猜有一种方法可以用 tidyr 包来解决这个问题,但对它不太熟悉。如果有人可以就如何清理这一切提供一些建议,我将不胜感激。

标签: r

解决方案


因此,根据您提供的数据,我在这里提出了一个解决方案。

您说“我需要从数据的测试拆分中提取客户编号并将其放入矩阵的第一列 - 这是我的主要问题”。提取的方法是:colnames(wsratings)dimnames(wsratings)[[2]]

一旦你有了这个向量(长度为 320),你想“把它放到第一列”。您要求 a cbind(),但要绑定它的数据的长度包含 43 行。您不能将它们绑定在一起,因为这两个元素的长度不相同或互为倍数

假设您拥有完整的数据集并且它们的长度匹配,那么代码将是:

customerid <-c("CustomerName", evaluation@runsTrain[[1]])
wsratings <- cbind(customerid, wsratings)

这就是我收集到的你想要的,它给我带来了以下结果:

在此处输入图像描述


推荐阅读