我尝试了各种选项(并进行了搜索),但是我根本无法在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**
答案 0 :(得分:0)
好的,我没有回答我的问题,但是我以不同的方式解决了这个问题。
我以主要日期和次要ID汇总了我的数据。 然后,我按主要ID和日期对数据进行了排序。 然后,我对它应用了row_number()函数,该函数可以按您提供的顺序工作,并且不需要指定列(我遇到困难的地方)。 然后,我将该子表重新加入到原始表中。
可以肯定的解决方法。遗憾的是,dplyr软件包中没有用于排名或行号的“密集”选项。