正确订购dplyr软件包中的密集等级商品

时间:2018-07-13 13:12:45

标签: r dplyr dense-rank

我尝试了各种选项(并进行了搜索),但是我根本无法在R中复制此SQL功能。

这是我的数据框和我要解决的问题的示例:

tbl <- read.table(text=
    "primaryid secondaryid date 
    1 1001 20180101
    1 1001 20180101
    1 1002 20180102
    2 2001 20180101
    2 2003 20180102
    2 2002 20180203" ,
    header=TRUE)

我希望该函数执行的操作是按日期显示在Primaryid分组中的secondaryID上,dense_rank因此正确的输出应该是:

primaryid   secondaryid date        sessionNumber
1           1001        20180101    1
1           1001        20180101    1
1           1002        20180102    2
2           2001        20180101    1
2           2003        20180102    **2**
2           2002        20180103    **3**

这是我正在尝试的:

tbl %>%        
    arrange(primaryid, date) %>%
    group_by(primaryid) %>%
    mutate(sessionNumber=dense_rank(secondaryid))

但是我得到的是按辅助编号列排序的数据,而不是日期。

primaryid   secondaryid date        sessionNumber
1           1001        20180101    1
1           1001        20180101    1
1           1002        20180102    2
2           2001        20180101    1
2           2003        20180102    **3**
2           2002        20180103    **2**

如果我只是简单地使用诸如row_number()之类的东西,那么这将简单地继承排列顺序,但是对于density_rank,您必须指定一个“ x”。我应该在这里如何使用density_rank()?

谢谢。

编辑 为了澄清以下问题,如果secondaryID有两个日期,则按日期排名会将它们拆分(不需要),例如

tbl <- read.table(text=
    "primaryid secondaryid date 
    1 1001 20180101
    1 1001 20180101
    1 1002 20180102
    2 2001 20180101
    2 2003 20180102
    2 2002 20180103
    2 2004 20180103
    2 2004 20180204" ,
    header=TRUE)

tbl %>%        
    arrange(primaryid, date) %>%
    group_by(primaryid) %>%
    mutate(sessionNumber=dense_rank(date))

给予;

 primaryid secondaryid     date sessionNumber
      <int>       <int>    <int>         <int>
1         1        1001 20180101             1
2         1        1001 20180101             1
3         1        1002 20180102             2
4         2        2001 20180101             1
5         2        2003 20180102             2
6         2        2002 20180103             3
7         2        2004 20180103             **3**
8         2        2004 20180204             **4**

但应提供:

 primaryid secondaryid     date sessionNumber
      <int>       <int>    <int>         <int>
1         1        1001 20180101             1
2         1        1001 20180101             1
3         1        1002 20180102             2
4         2        2001 20180101             1
5         2        2003 20180102             2
6         2        2002 20180103             3
7         2        2004 20180103             **4**
8         2        2004 20180204             **4**

1 个答案:

答案 0 :(得分:0)

好的,我没有回答我的问题,但是我以不同的方式解决了这个问题。

我以主要日期和次要ID汇总了我的数据。 然后,我按主要ID和日期对数据进行了排序。 然后,我对它应用了row_number()函数,该函数可以按您提供的顺序工作,并且不需要指定列(我遇到困难的地方)。 然后,我将该子表重新加入到原始表中。

可以肯定的解决方法。遗憾的是,dplyr软件包中没有用于排名或行号的“密集”选项。