Сортировать рейтинг матрицы в R - PullRequest
1 голос
/ 12 января 2020

Моя матрица оценок имеет много значений 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]
}

Сначала я пытаюсь отсортировать его таким образом, но понимаю, что ничего не делаю со значениями. Есть ли способ сделать это?

Пример данных: rating matrix

1 Ответ

0 голосов
/ 13 января 2020

Я сделаю несколько примеров данных:

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

Отсюда просто используйте rowSums и 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.

...