假設我有一個包含數千種產品的資料集。對于所有產品,我知道它們在 main_rating_platform 上的評分方式以及它們在 Alternative_rating_platform 上的評分方式。碰巧的是,平均而言,產品在alternative_rating_platform 上的評分更差。這是資料集的一個小例子:
df <- data.frame(product_id=c("a2a","zyz","xyz","9io","rop"),
main_rating_platform = c(4.07,3.99,4.81,3.71,3.99),
alternative_rating_platform = c(3.67,3.59,4.21,3.71,3.67))
我的最終目標是根據 main_rating_platform對 product_ids 進行排名,但只有這個特定產品根據alternative_rating_platform 的評級進行評級。
我嘗試過,現在知道該怎么做,是這樣的:(是的,我希望這樣的產品具有相同的等級,當它們具有相同的評級時:))
library(dplyr)
df <- df %>% mutate(ranking_mainplatform = dense_rank(desc(main_rating_platform )))
df <- df %>% mutate(ranking_alternativeplatform = dense_rank(desc(alternative_rating_platform)))
但這不是我需要的。我想知道product_id a2a 的等級,如果它是用alternative_rating_platform 的評級來評級的,而在其他條件不變的情況下,所有其他產品的評級仍然來自main_rating_platform。例如,突然產品 a2a,而不是 4.07,將被評為 3.67 星。然后它實際上不是第二好的產品,而是最差的產品,因此排名第 5。
這應該是我希望最終得到的變數:
df$newranking_for_this_product_on_main_platform_but_with_rating_from_alternative_platform_ceterisparibus <- c(5,5,1,4,5)
我很難繞開回圈。如果有一個解決方案可以在沒有回圈的情況下作業并且對大資料計算友好,那就太好了。但是,如果這里必須有一個回圈,那就這樣吧=)
uj5u.com熱心網友回復:
這可能無法很好地擴展,因為您最終要對每一行進行兩次迭代(即使沒有明確的 for 回圈,也有在幕后)。基本上,在下面的代碼中,它會遍歷每一個product_id并創建一個新評級串列,只是在該行的替代評級中進行替換。然后它會回傳并計算這個 sub 1 串列的排名。
library(dplyr)
library(purrr)
df <- data.frame(product_id=c("a2a","zyz","xyz","9io","rop"),
main_rating_platform = c(4.07,3.99,4.81,3.71,3.99),
alternative_rating_platform = c(3.67,3.59,4.21,3.71,3.67))
df <- df |>
mutate(sub1Ratings = map(
seq_along(product_id),
function(i, main, alt) {
main[i] <- alt[i]
main
},
main = main_rating_platform,
alt = alternative_rating_platform
))|>
mutate(
sub1Rank = imap(sub1Ratings, ~dense_rank(desc(.x))[.y])
)
as.integer(df$sub1Rank)
#> [1] 4 5 1 4 5
由于處理平局的方式,輸出排名與您在問題中的排名不完全匹配dense_rank。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511132.html
標籤:r循环dplyr排行
上一篇:R中多列的If陳述句
下一篇:變數在for回圈中未正確分配
