R 确定汽车和非汽车模式之间最多1小时的时差

R 确定汽车和非汽车模式之间最多1小时的时差,r,dataframe,R,Dataframe,我有 我想找一个专栏,看看在每个家庭中,非汽车模式是否最多比汽车模式早1个小时 我需要该列作为一个人或多个人的索引,这些人在这个时间段与另一个人相交 在上面的示例“第一家庭”中,第一人称的时间比第四人称早1小时,因此在新列中,第一人称的婴儿为4,第四人称的婴儿为1。 输出: 与其他家庭成员的交集不为0或类似NA的任何东西这里有一个生成这些匹配项的dplyr方法 household person time mode overlap

我有

我想找一个专栏,看看在每个家庭中,非汽车模式是否最多比汽车模式早1个小时

我需要该列作为一个人或多个人的索引,这些人在这个时间段与另一个人相交

在上面的示例“第一家庭”中,第一人称的时间比第四人称早1小时,因此在新列中,第一人称的婴儿为4,第四人称的婴儿为1。 输出:


与其他家庭成员的交集不为0或类似NA的任何东西这里有一个生成这些匹配项的
dplyr
方法

 household       person     time           mode             overlap
      1           1          07:45:00        non-car           4
      1           1          09:05:00        car               2
      1           2          08:10:00        non-car           4,1
      1           3          22:45:00        non-car           0
      1           4          08:30:00        car               1,2
      1           5          22:00:00         car              0
      2           1          07:45:00        non-car            0
      2           2          16:45:00        car                0
库(dplyr);图书馆(hms)
df%>%
#将桌子连接到自己,按家庭连接。
#因此,每一行都链接到每一行(包括它本身)
#同一个家庭。带有end.x和
#连接的数据将以.y结尾,因此我们可以在下面进行比较。
左联合(df,by=c(“家庭”))%>%
#找出时间差,以秒为单位
突变(time_dif=abs(time.y-time.x))%>%
过滤器(时间差<3600,#如果百分比保持#如果不同模式保持
#我们现在有了答案,下面的所有内容都是用于格式化的
#重命名并隐藏一些我们不再需要的变量
选择(家庭,人=人.x,时间=时间.x,
模式=模式x,其他=个人y)%>%
#将每个人的重叠部分合并为一行
按(家庭、个人、时间)分组%>%
总结(重叠=粘贴(其他,折叠=“,”),时间=长度(其他))%>%
#添加回所有原始行,即使没有重叠
右联合(df)%>%
解组()
##一个tibble:7x6
#家庭人时重叠时间模式
#                 
#11 07:45 4 1非汽车
#21109:05 21辆车
#3 1 2 08:10 1,4 2非汽车
#4 1 3 22:45不适用不适用非汽车
#5 1 4 08:30 1,2 2车厢
#6 2 1 07:45不适用非汽车
#7216:45北美汽车

这里有一个生成这些匹配的
dplyr
方法

 household       person     time           mode             overlap
      1           1          07:45:00        non-car           4
      1           1          09:05:00        car               2
      1           2          08:10:00        non-car           4,1
      1           3          22:45:00        non-car           0
      1           4          08:30:00        car               1,2
      1           5          22:00:00         car              0
      2           1          07:45:00        non-car            0
      2           2          16:45:00        car                0
library(dplyr);library(hms)
df%>%
#将桌子连接到自己,按家庭连接。
#因此,每一行都链接到每一行(包括它本身)
#同一住户。原始数据带有end.x和
#连接的数据将以.y结尾,因此我们可以在下面进行比较。
左联合(df,by=c(“家庭”))%>%
#找出时间差,以秒为单位
突变(time_dif=abs(time.y-time.x))%>%
过滤器(时间差<3600,#如果百分比保持#如果不同模式保持
#我们现在有了答案,下面的所有内容都是用于格式化的
#重命名并隐藏一些我们不再需要的变量
选择(家庭,人=人.x,时间=时间.x,
模式=模式x,其他=个人y)%>%
#将每个人的重叠部分合并为一行
按(家庭、个人、时间)分组%>%
总结(重叠=粘贴(其他,折叠=“,”),时间=长度(其他))%>%
#添加回所有原始行,即使没有重叠
右联合(df)%>%
解组()
##一个tibble:7x6
#家庭人时重叠时间模式
#                 
#11 07:45 4 1非汽车
#21109:05 21辆车
#3 1 2 08:10 1,4 2非汽车
#4 1 3 22:45不适用不适用非汽车
#5 1 4 08:30 1,2 2车厢
#6 2 1 07:45不适用非汽车
#7216:45北美汽车


这看起来几乎是一样的,但它是不同的,这里我们没有时间间隔,只是比较了启动时间,并将非车载模式与每种模式下的车载模式进行了比较household@G.Grothendieck你能帮我解决这个问题吗?我已经花了很多时间,但没能让它发生变化。我认为这其实是一样的,除了上面的定义美联社。这看起来几乎是一样的,因为它是不同的,在这里我们没有时间间隔,只是开始时间比较,非汽车模式比较与汽车模式在每个household@G.Grothendieck你能帮我解决这个问题吗?我已经花了很多时间,但没能做到。我认为除了重叠的定义外,这是真的一样在我的模型中使用了此解决方案,但正如我在问题中提到的,我希望非汽车模式在模式汽车之前1小时。使用您的解决方案,我可以同时获得这两种模式。您可以修复它吗?我不确定我是否遵循。您希望输出与您描述的输出不同吗?不,在本例中,我没有这种情况。因此输出是正确的。让我编辑我的示例确定我添加了对于第一个家庭,第五个人和第三个人之间的差异小于1,但非汽车模式的时间更大。基本上,如果汽车模式的时间小于非汽车模式的时间,您可以删除输出吗?我在我的模型中使用了此解决方案,但正如我在问题中提到的,我希望非汽车模式的时间比汽车模式的时间早1小时我两个都懂。你能修好吗?我不确定我是否懂。你想要不同于你描述的输出吗?不,在这个例子中,我没有那样的输出。所以输出是正确的。让我编辑我的示例好吧,我将第五个人添加到第一个家庭中,现在第三和第五个人之间的差异小于1,但非汽车模式的时间更长基本上,如果汽车模式的时间小于非汽车模式,您可以删除输出吗?
library(dplyr); library(hms)
df %>%
  # Connect the table to itself, linking by household.
  #   So every row gets linked to every row (including itself)
  #   with the same household. The original data with end .x and 
  #   the joined data will end .y, so we can compare then below.
  left_join(df, by = c("household")) %>%
  # Find the difference in time, in seconds
  mutate(time_dif = abs(time.y - time.x)) %>%
  filter(time_dif < 3600,       # Keep if <1hr difference
         person.x != person.y,  # Keep if different person
         mode.x != mode.y) %>%  # Keep if different mode

  # We have the answers now, everything below is for formatting

  # Rename and hide some variables we don't need any more
  select(household, person = person.x, time = time.x, 
         mode = mode.x, other = person.y) %>%
  # Combine each person's overlaps into one row
  group_by(household, person, time) %>%
  summarise(overlaps  = paste(other, collapse =","), times = length(other)) %>%
  # Add back all original rows, even if no overlaps
  right_join(df) %>%
  ungroup()


## A tibble: 7 x 6
#  household person time   overlaps times mode   
#      <int>  <int> <time> <chr>    <int> <chr>  
#1         1      1 07:45  4            1 non-car
#2         1      1 09:05  2            1 car    
#3         1      2 08:10  1,4          2 non-car
#4         1      3 22:45  NA          NA non-car
#5         1      4 08:30  1,2          2 car    
#6         2      1 07:45  NA          NA non-car
#7         2      2 16:45  NA          NA car