R 使用指示符和列更改列的值

R 使用指示符和列更改列的值,r,dataframe,R,Dataframe,我有 如果他们的时间最多比汽车晚1小时,我需要改变公共汽车和汽车的时间。如果有多辆车可用,他们的时间将是最近的车 输出 household person mode time 1 1 car 8:00 1 2 car 9:00 1 3

我有

如果他们的时间最多比汽车晚1小时,我需要改变公共汽车和汽车的时间。如果有多辆车可用,他们的时间将是最近的车

输出

        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

在第一个家庭中,3人和4人与第一个司机的时间比较近。

这里有一个
tidyverse
+
lubridate
选项

        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
库(lubridate)
图书馆(tidyverse)
df%>%
组别(住户)%>%
变异(时间=如果其他(
%c(“公共汽车”、“步行”)中的模式%&
hm(时间)

说明:这是对您情况的直译。我们将家庭分组,如果模式为“公共汽车”或“步行”,并且他们的时间比“汽车”的时间晚1小时或更少,则修改时间.

在这个数据中,
家庭
数字也不重要吗?按家庭分组的数据,所以在每个家庭中,我想进行比较,但是
不重要吗?不,不重要,我的时间格式是“%H:%M:%S”,可能是因为这个错误吗?@shere好的,是的,这会有区别。尝试替换
hms
用于
hm
。仍然错误:错误:
true
的长度必须为6(条件的长度)或1,而不是4调用
rlang::last_error()
要查看回溯问题是我每个家庭都有超过一个人拥有mode car,你能修复它吗?@shere修复你的帖子!到目前为止,通过评论我们发现,(1)你想按“家庭”分组,(2)“人”是不相关的,(3)你的时间格式实际上是HH:MM:SS,而不是样本数据中的HH:MM,以及(4)每个“家庭”有多个“汽车”条目。所有这些都属于你的主要帖子!你看到问题了吗?
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