首页 > 解决方案 > R中的排序评分矩阵

问题描述

我制作的评分矩阵有很多 N/A 值(用户评分笑话矩阵)。我需要对矩阵进行排序,其中费率最高的用户位于矩阵的开头,而费率较低的用户位于矩阵的底部。我的代码:

csv_table=read.csv('Jester5k.csv', header = TRUE, sep = ",", quote = "\"",dec = ".")

Row_num=max(csv_table$user_id)
Num_Unique_usersid=length(unique(csv_table$user_id))
Row_num==Num_Unique_usersid
Unique_users=unique(csv_table$user_id)

Col_num=max(csv_table$jokes)
Num_Unique_jokes=length(unique(csv_table$jokes))
Col_num==Num_Unique_jokes
Unique_jokes=unique(csv_table$jokes)


rownames(Mat_ratings)=paste0("userid_",seq(1:nrow(Mat_ratings)))
colnames(Mat_ratings)=paste0("jokes_",Unique_jokes)


Unique_users_sorted=sort(unique(csv_table$user_id))
identical(Unique_users_sorted,Unique_users)

Unique_items_sorted=sort(unique(csv_table$jokes))
identical(Unique_items_sorted,Unique_jokes)

Mat_ratings=matrix(NA, nrow = Row_num, ncol = Num_Unique_jokes)

rownames(Mat_ratings)=paste0("user_",Unique_users_sorted)
colnames(Mat_ratings)=paste0("item_",Unique_items_sorted)

for (i in 1:nrow(csv_table)){
  Mat_ratings[which(csv_table$user_id[i]==Unique_users_sorted),
              which(csv_table$jokes[i]==Unique_items_sorted)]=
    csv_table$rating[i]
}

首先,我尝试以这种方式对其进行排序,但我知道我并没有真正对这些值做任何事情。有没有办法做到?

数据样本: 评分矩阵

标签: rsortingmatrixrating

解决方案


我将组成一些示例数据:

mtx <- matrix(sample(5, size = 28, replace = TRUE), nrow = 7, ncol = 4)
dimnames(mtx) <- list(paste0("user_", 1:7), paste0("item_", 1:4))
set.seed(42)
mtx[sample(28, size = 10)] <- NA
mtx
#        item_1 item_2 item_3 item_4
# user_1      3     NA      1      5
# user_2      4      3     NA      2
# user_3     NA      3     NA      4
# user_4      2      5      5      1
# user_5      3     NA      3     NA
# user_6      5      5     NA      1
# user_7      5     NA     NA     NA

从这里,只需使用rowSumsand order

mtx[order(rowSums(is.na(mtx))),]
#        item_1 item_2 item_3 item_4
# user_4      2      5      5      1
# user_1      3     NA      1      5
# user_2      4      3     NA      2
# user_6      5      5     NA      1
# user_3     NA      3     NA      4
# user_5      3     NA      3     NA
# user_7      5     NA     NA     NA

如果您有排序的次要因素,请将它们包含在order调用中。


推荐阅读