每组分配给每个开始时间最晚的结束时间和属于 R 中最高 ID 的传输模式

per group assign to every start time the latest end time and transport mode that belongs to the highest ID in R

我有一个数据操作问题,我可以单独解决这两个插补问题,但不能同时解决这两个问题。我有一个按 ID(不同的人)分组的轨道数据集,每个轨道都有开始时间、结束时间、唯一 ID,有时还有运输模式(但这可能会丢失)。可以这么说,在收集数据的过程中出现了一些错误,现在很多轨迹已经保存了多次(所以轨迹具有不同的行程 ID,但相同的人 ID、开始时间和相同的结束时间,或者具有相同的轨迹人员 ID、开始时间和不同的结束时间或交通方式。我发现处理此数据的正确方法是针对具有相同人员 ID 和完全相同开始时间的轨道,以保存最新的结束时间和出行方式属于最高旅行ID。所以,确实会发生相同开始时间的旅行有不同的旅行模式,在这种情况下,我想保持旅行模式属于最高旅行ID(按人员ID和开始时间分组) .但是,这次旅行不一定有最晚的结束时间,我确实需要在该组中保存每个旅行的最晚结束时间(人员ID和开始时间)。如果对于某个旅行根本没有旅行模式,这也需要保持缺失。为我 c 的事实道歉蚂蚁描述得更清楚了,希望这个例子能解释我在找什么:

输入

| ID_person | ID_Track | START | END | mode |
|-----------|----------|-------|-----|------|
| 1         | 1        | 8     | 10  | A    |
| 1         | 2        | 8     | 10  | NA   |
| 1         | 3        | 8     | 10  | B    |
| 1         | 4        | 8     | 11  | NA   |
| 1         | 5        | 8     | 10  | A    |
| 1         | 6        | 8     | 11  | C    |
| 1         | 7        | 12    | 13  | NA   |
| 1         | 8        | 12    | 13  | A    |
| 1         | 9        | 14    | 15  | NA   |
| 2         | 10       | 8     | 9   | NA   |
| 2         | 11       | 8     | 9   | NA   |
| 2         | 12       | 8     | 11  | A    |
| 2         | 13       | 8     | 9   | D    |
| 2         | 14       | 8     | 10  | B    |
| 2         | 15       | 12    | 13  | D    |
| 2         | 16       | 15    | 16  | NA   |

我想要的


| ID_person | ID_Track | START | END | mode |
|-----------|----------|-------|-----|------|
| 1         | 1        | 8     | 11  | C    |
| 1         | 2        | 8     | 11  | C    |
| 1         | 3        | 8     | 11  | C    |
| 1         | 4        | 8     | 11  | C    |
| 1         | 5        | 8     | 11  | C    |
| 1         | 6        | 8     | 11  | C    |
| 1         | 7        | 12    | 13  | A    |
| 1         | 8        | 12    | 13  | A    |
| 1         | 9        | 14    | 15  | NA   |
| 2         | 10       | 8     | 11  | B    |
| 2         | 11       | 8     | 11  | B    |
| 2         | 12       | 8     | 11  | B    |
| 2         | 13       | 8     | 11  | B    |
| 2         | 14       | 8     | 10  | B    |
| 2         | 15       | 12    | 13  | D    |
| 2         | 16       | 15    | 16  | NA   |


获取输入的一些代码

df <- structure(list(ID_person = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                             1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), ID_Track = 1:16, START = c(8L, 
                                                                                         8L, 8L, 8L, 8L, 8L, 12L, 12L, 14L, 8L, 8L, 8L, 8L, 8L, 12L, 15L
                             ), END = c(10L, 10L, 10L, 11L, 10L, 11L, 13L, 13L, 15L, 9L, 9L, 
                                        11L, 9L, 10L, 13L, 16L), mode = c("A", NA, "B", NA, "A", "C", 
                                                                         NA, "A", NA, NA, NA, "A", "D", "B", "D", NA)), .Names = c("ID_person", 
                                                                                                                                    "ID_Track", "START", "END", "mode"), row.names = c(NA, -16L), class = "data.frame")

试试下面的方法:

library(dplyr)

df %>%
  group_by(ID_person, START) %>%
  mutate(
    END = max(END),
    mode = mode[which.max(ID_Track)]
  )