r - 将第一行(列标题)写入向量
问题描述
我有一个从 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 包来解决这个问题,但对它不太熟悉。如果有人可以就如何清理这一切提供一些建议,我将不胜感激。
解决方案
因此,根据您提供的数据,我在这里提出了一个解决方案。
您说“我需要从数据的测试拆分中提取客户编号并将其放入矩阵的第一列 - 这是我的主要问题”。提取的方法是:colnames(wsratings)
或dimnames(wsratings)[[2]]
。
一旦你有了这个向量(长度为 320),你想“把它放到第一列”。您要求 a cbind()
,但要绑定它的数据的长度包含 43 行。您不能将它们绑定在一起,因为这两个元素的长度不相同或互为倍数。
假设您拥有完整的数据集并且它们的长度匹配,那么代码将是:
customerid <-c("CustomerName", evaluation@runsTrain[[1]])
wsratings <- cbind(customerid, wsratings)
这就是我收集到的你想要的,它给我带来了以下结果:
推荐阅读
- python - 如何使用 pip 安装 gspread?
- xslt - Xpath3 表达式或 XSLT 代码以获取具有特定属性的所有节点名称,以便它们出现
- python - Pygame 如何制作斜坡?
- java - 如何使用 Camel Jms 事务回滚回滚 OracleDB 提交
- excel - Excel VBA || 在过滤范围内填充值
- f# - 如何在 Elmish.WPF 中完成子/子模型到父/主模型的消息传递?
- r - R:如何在特定列上删除包含小于 -4 和大于 4 的任何值的行?
- .net-core - 生产机器上的 aspnet 核心部署正在使用开发机器路径寻找 appsettings.json
- javascript - 在javascript中传递选中的复选框值
- javascript - 如何从普通 Javascript 文件中的 React 功能组件访问函数?