我有一个包含许多学生的数据集,每个学生都处理多个文件,每个文件都有多个时间度量。我正在尝试生成一个'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)
时,它不符合不同的时间顺序。
答案 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