使用指标和列更改列的值

时间:2019-09-04 22:06:35

标签: r dataframe

我有

        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个人与第一个驾驶员的时间较近。

1 个答案:

答案 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小时或更短,则修改时间。