r-根据变量对id进行排序,该变量随着另一个变量的值而重复变化



假设我有一个数千产品的数据集。对于所有产品,我都知道它们在main_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颗星。然后,它不是第二好的产品,而是最差的产品,因此排名第五。

这应该是我希望最终得到的变量:

df$newranking_for_this_product_on_main_platform_but_with_rating_from_alternative_platform_ceterisparibus <- c(5,5,1,4,5)

我很难让自己的头脑清醒过来。如果有一个解决方案可以在没有循环的情况下工作,并且对大数据的计算友好,那就太好了。但如果循环是必须的,那么就顺其自然=(

这可能无法很好地扩展,因为您最终要对每行进行两次迭代(即使没有显式的for循环,也有隐藏的循环(。基本上,在下面的代码中,它遍历每个product_id,并创建一个新评级列表,仅作为该行备选评级的子评级。然后,它返回并计算这个子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如何处理平局,输出排名与问题中的排名并不完全匹配。

最新更新