【问题标题】:How to make your ranking values show integer (without decimals) in R data.table如何使您的排名值在 R data.table 中显示整数(不带小数)
【发布时间】:2019-03-26 15:42:42
【问题描述】:

我必须对一个数据集进行排名,该数据集由该数据集中的几个变量排序,并由该数据集中的另一个变量分组。当我在 data.table 上使用排名方法时,排名值是小数。我需要它们是没有小数部分的整数。

下面,我提供了我需要的摘要。我正在从本网站的另一个问题中复制其他人的示例(也与排名方法有关)。我发现该问题的答案很有用,但它仍然没有提供使排名结果成为不带小数的整数的方法。这就是为什么我在这里复制它并将它作为这个问题的起点(因为不允许在答案下提出不同的问题)。

我需要根据几个变量进行排名,按一个(或几个变量)分组,然后得到一个不带小数的整数排名。

这是另一个人的例子:

他创建了数据表:

library(data.table)

t1 <- data.table (id = c('11', '11', '11', '22','22',
                         '88', '99','44','44', '55'),
                          date = as.Date(c("01-01-2016", 
                                "01-02-2016", 
                                "01-02-2016",
                                "02-01-2016", 
                                "02-02-2016"),
                              format = "%m-%d-%Y"))


setkey(dt1, date)
setkey(dt1, id)
dt1
    id       date

1: 11 2016-01-01

2: 11 2016-01-02

3: 11 2016-01-02

4: 22 2016-02-01

5: 22 2016-02-02

6: 44 2016-01-02

7: 44 2016-02-01

8: 55 2016-02-02

9: 88 2016-01-01

10: 99 2016-01-02

在这里,他根据变量date 进行排名并按id 分组:

dt1[, rank := frank(date), by = list(id)]
dt1

    id       date  rank
1: 11 2016-01-01   1.0
2: 11 2016-01-02   2.5
3: 11 2016-01-02   2.5
4: 22 2016-02-01   1.0
5: 22 2016-02-02   2.0
6: 44 2016-01-02   1.0 
7: 44 2016-02-01   2.0
8: 55 2016-02-02   1.0
9: 88 2016-01-01   1.0
10: 99 2016-01-02   1.0

结果应该是这样的:

    id       date  rank
 1: 11 2016-01-01   1
 2: 11 2016-01-02   2
 3: 11 2016-01-02   2
 4: 22 2016-02-01   1
 5: 22 2016-02-02   2
 6: 44 2016-01-02   1
 7: 44 2016-02-01   2
 8: 55 2016-02-02   1
 9: 88 2016-01-01   1
10: 99 2016-01-02   1

【问题讨论】:

  • 试试floor(frank(date))

标签: r data.table ranking


【解决方案1】:

您可以在frank 中指定您希望如何处理关系。 有一个参数ties.method 默认为平均值,这会导致十进制排名。详情请见?frank

你可以例如设置

dt1[, rank := frank(date, ties.method = "min"), by = list(id)]

获得整数排名。

【讨论】:

  • 啊!好的...我知道我必须添加 ties.method,但我只是在 frank 之外添加它,例如 rank := frank(date)、by = list(id)、ties.method = "min"]。所以它显然不起作用......非常感谢。这非常有帮助......但是现在,添加你所说的我收到一条错误消息:“RHS 类型('integer')必须匹配 LHS('double')。检查和强制对最快的性能影响太大情况。要么更改目标列的类型,要么自己强制 := 的 RHS(例如,使用 1L 而不是 1)"
  • @Paco 清除列(当前有十进制值)dt1[, rank := NULL] 并重试。 (您不能在 by= 表达式中更改列的类型。)
猜你喜欢
  • 1970-01-01
  • 2012-02-13
  • 2017-08-09
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多