改变订单的组内密集排名

时间:2015-12-01 01:50:33

标签: r dplyr

我有一个包含许多学生的数据集,每个学生都处理多个文件,每个文件都有多个时间度量。我正在尝试生成一个'FileOrder'变量,指示每个学生浏览文件的顺序。我一直在使用dplyr,因为我对它使用的动词很满意。我已经能够按分钟为每个文件制作一个序列,但是我很难为已完成的文件制作一个序列。

一些学生和时间点:

data <- structure(list(Day = c(67L, 67L, 67L, 71L, 74L, 74L, 71L, 71L, 
71L, 71L, 71L, 71L, 67L, 67L, 67L, 71L, 71L, 71L, 74L, 74L, 74L, 
75L, 75L, 75L, 68L, 68L, 68L), Hour = c(10L, 10L, 10L, 10L, 10L, 
10L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 9L, 9L, 9L, 11L, 
11L, 11L, 10L, 10L, 10L, 10L, 10L, 10L), Min = c(13L, 14L, 15L, 
19L, 35L, 36L, 51L, 52L, 53L, 2L, 3L, 4L, 14L, 15L, 16L, 12L, 
13L, 14L, 5L, 6L, 7L, 45L, 46L, 47L, 54L, 55L, 56L), Student = c("C01", 
"C01", "C01", "C01", "C01", "C01", "C01", "C01", "C01", "C02", 
"C02", "C02", "C02", "C02", "C02", "C02", "C02", "C02", "C03", 
"C03", "C03", "C03", "C03", "C03", "C03", "C03", "C03"), File = c("capecod.ng3", 
"capecod.ng3", "capecod.ng3", "colonial.ng3", "colonial.ng3", 
"colonial.ng3", "ranch.ng3", "ranch.ng3", "ranch.ng3", "capecod.ng3", 
"capecod.ng3", "capecod.ng3", "colonial.ng3", "colonial.ng3", 
"colonial.ng3", "ranch.ng3", "ranch.ng3", "ranch.ng3", "capecod.ng3", 
"capecod.ng3", "capecod.ng3", "colonial.ng3", "colonial.ng3", 
"colonial.ng3", "ranch.ng3", "ranch.ng3", "ranch.ng3")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -27L), .Names = c("Day", 
"Hour", "Min", "Student", "File"))

这是我尝试过的,但是dense_rank()函数似乎是按字母顺序而不是按时间排序文件。

data %>%
  group_by(Student) %>%
  arrange(Day, Hour, Min) %>%
  mutate(FileOrder = dense_rank(File))

是否有一个电话可以让我这样的事情(请记住,每个文件有多个时间点,这里没有显示)?

更新了所需的输出

我希望每个文件中的每个时间点都有一个FileOrder编号。如果我做了@Adam建议filter()distinct(),我之前尝试过,只为每个学生留下一行。最后,我希望能够为学生所处理的第一个文件选择所有时间点,因此在订购它们时创建一个变量似乎是合乎逻辑的下一步。

   Day Hour Min Student         File  FileOrder
1   67   10  13     C01  capecod.ng3  1
2   67   10  14     C01  capecod.ng3  1
3   67   10  15     C01  capecod.ng3  1
4   71    9  51     C01    ranch.ng3  2
5   71    9  52     C01    ranch.ng3  2
6   71    9  53     C01    ranch.ng3  2
7   71   10  19     C01 colonial.ng3  3
8   74   10  35     C01 colonial.ng3  3
9   74   10  36     C01 colonial.ng3  3
10  67   10  14     C02 colonial.ng3  1
11  67   10  15     C02 colonial.ng3  1
12  67   10  16     C02 colonial.ng3  1
13  71    9  12     C02    ranch.ng3  2
14  71    9  13     C02    ranch.ng3  2
15  71    9  14     C02    ranch.ng3  2
16  71   10   2     C02  capecod.ng3  3
17  71   10   3     C02  capecod.ng3  3
18  71   10   4     C02  capecod.ng3  3
...

请注意,序列按学生和文件分组,但根据日,小时,分钟,每个学生的文件顺序不同。使用dense_rank(File)时,它不符合不同的时间顺序。

1 个答案:

答案 0 :(得分:0)

据我了解,您只需要每个学生访问的第一个文件,+学生按时间顺序访问此文件的时间戳。在这种情况下,dense_rank不是必需的,您的示例中间输出表也不是。

data %>%
  group_by(Student) %>%
  arrange(Day, Hour, Min) %>%
  filter(File == File[[1]]) 

给出了

Source: local data frame [9 x 5]
Groups: Student [3]

    Day  Hour   Min Student         File
  (int) (int) (int)   (chr)        (chr)
1    67    10    13     C01  capecod.ng3
2    67    10    14     C01  capecod.ng3
3    67    10    15     C01  capecod.ng3
4    67    10    14     C02 colonial.ng3
5    67    10    15     C02 colonial.ng3
6    67    10    16     C02 colonial.ng3
7    68    10    54     C03    ranch.ng3
8    68    10    55     C03    ranch.ng3
9    68    10    56     C03    ranch.ng3

如果确实需要为每个文件指定的文件排序,那么

data %>%
    group_by(Student) %>%
    arrange(Day, Hour, Min) %>%
    mutate(FileOrder = cumsum(File != dplyr::lag(File, 1, default = ''))) %>%
    data.frame

给出

   Day Hour Min Student         File FileOrder
1   67   10  13     C01  capecod.ng3         1
2   67   10  14     C01  capecod.ng3         1
3   67   10  15     C01  capecod.ng3         1
4   71    9  51     C01    ranch.ng3         2
5   71    9  52     C01    ranch.ng3         2
6   71    9  53     C01    ranch.ng3         2
7   71   10  19     C01 colonial.ng3         3
8   74   10  35     C01 colonial.ng3         3
9   74   10  36     C01 colonial.ng3         3
10  67   10  14     C02 colonial.ng3         1
11  67   10  15     C02 colonial.ng3         1
12  67   10  16     C02 colonial.ng3         1
13  71    9  12     C02    ranch.ng3         2
14  71    9  13     C02    ranch.ng3         2
15  71    9  14     C02    ranch.ng3         2
16  71   10   2     C02  capecod.ng3         3
17  71   10   3     C02  capecod.ng3         3
18  71   10   4     C02  capecod.ng3         3
19  68   10  54     C03    ranch.ng3         1
20  68   10  55     C03    ranch.ng3         1
21  68   10  56     C03    ranch.ng3         1
22  74   11   5     C03  capecod.ng3         2
23  74   11   6     C03  capecod.ng3         2
24  74   11   7     C03  capecod.ng3         2
25  75   10  45     C03 colonial.ng3         3
26  75   10  46     C03 colonial.ng3         3
27  75   10  47     C03 colonial.ng3         3