【问题标题】:Adding rank column based on other numeric column [duplicate]基于其他数字列添加排名列[重复]
【发布时间】:2017-03-05 14:43:41
【问题描述】:

我在创建新排名列时遇到问题。我有以下数据:

Title             Cat. Rank     
The Da Vinci Code Book 19
The Da Vinci Code Book 19
The Da Vinci Code Book 19
Sisterhood....    Book 21
Book X            Book 34
Book X            Book 34

我需要根据当前排名列创建一个新的排名列,其中达芬奇代码在所有行中使用达芬奇代码都为 1。当出现新标题时,排名应更改为 2 等。

我一直在尝试很多不同的排名,例如:

  dt.reviews.books.new[,sales_rank_cat:=rank(title, ties.method="first"),by=title]

但这会为每个标题分配一个 1。

【问题讨论】:

  • 试试dt.reviews.books.new[, sales_rank_cat := .GRP, by = title]
  • 谢谢,这行得通!

标签: r data.table


【解决方案1】:

在我看来,您是在说《达芬奇密码》将始终获得 1,而其他游戏已经按照排名顺序排列,因此以下标题将获得 2、3、....n。

library(data.table)
newDF <- data.table(dt.reviews.books.new) %>%
         newDF[, newRank := 1:.N, by = "Title"]

再次警告,此排名假设您的标题当前处于排名顺序。如果您的新排名基于当前排名,我将使用sort()arrange()Rank 排序。

【讨论】:

  • newDF % newDF[, newRank := 1:.N, by = "title"] 我收到以下错误:错误in [.data.table(., newDF, , :=(newRank, 1:.N), by = "title") :提供 'by' 或 'keyby' 但不能同时提供
  • 而且标题确实已经排好序了!
  • 这里的管道完全无关/混淆/不必要
【解决方案2】:
library(dplyr)
df %>% mutate(rank = dense_rank((rank)))

如果排名数字有意义,您可以使用desc

df %>% mutate(rank = dense_rank(desc(rank)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多