我有
household person mode time
1 1 car 8:00
1 2 car 9:00
1 3 bus 7:00
1 4 bus 7:30
1 4 walk 8:30
1 5 car 10:00
2 1 car 9:00
2 2 bus 11:00
如果他们的时间比汽车最多晚1小时,我需要更改公共汽车的时间并按汽车的时间步行。如果有不止一辆车,那么他们的时间将是最近的一辆车。
输出
household person mode time
1 1 car 8:00
1 2 car 9:00
1 3 bus 8:00
1 4 bus 8:00
1 5 walk 9:00
1 6 car 10:00
2 1 car 9:00
2 2 bus 11:00
在第一个家庭中,第3和第4个人与第一个驾驶员的时间较近。
答案 0 :(得分:2)
这是一个tidyverse
+ lubridate
选项
library(lubridate)
library(tidyverse)
df %>%
group_by(household) %>%
mutate(time = if_else(
mode %in% c("bus", "walk") &
hm(time) < hm(time)[mode == "car"] &
as.numeric(hm(time) - hm(time)[mode == "car"]) / 3600 <= 1,
time[mode == "car"], time)) %>%
ungroup()
## A tibble: 6 x 4
# household person mode time
# <int> <int> <fct> <fct>
#1 1 1 car 8:00
#2 1 2 bus 8:00
#3 1 3 bus 8:00
#4 1 4 walk 8:30
#5 2 1 car 9:00
#6 2 2 bus 11:00
说明:这是您情况的字面意思。我们group_by
的家庭,如果模式是“公共汽车”或“步行”并且他们的时间比“汽车”的时间晚1小时或更短,则修改时间。