配对最多相差一小时的行

时间:2019-09-08 13:38:58

标签: r dataframe

很抱歉,如果我以其他方式提出问题,我只需要解决我的问题即可。我已经在这里发布time comparison with the help of another column

现在,我想使其更简单,以便有人给我答案。

我在这里Determining at most 1 hour time difference between car and non-car mode

发表了类似的问题

但是由于我没有得到答案,所以我更改了输出格式以使其更简单。 (甚至不确定它是否更简单)

我有

 household       person     time           
      1           1          07:45:00       
      1           1          09:05:00         
      1           2          08:10:00         
      1           3          22:45:00       
      1           4          08:30:00         
      2           1          07:45:00       
      2           2          16:45:00       

我想找到一列,以了解每个家庭中的人是否彼此之间有近距离旅行。

如果一行距离另一趟旅行最多1小时,我想将它们配对。

在上面的示例第一家庭中,第一人称的时间比第4个人早1小时。 输出:

 household       person     time                   household       person     time                
      1           1          07:45:00              1           4          08:30:00            
      1           1          07:45:00              1           2          08:10:00        
      1           2          08:10:00              1           4          08:30:00          
      1           2          08:10:00              1           1          09:05:00    
      1           4          08:30:00              1           1          09:05:00    
      1           3          22:45:00              NA          NA           NA                          
      1           2          08:10:00              1           1          09:05:00                       
      2           1          07:45:00              NA          NA.          NA                              
      2           2          16:45:00              NA          NA.          NA                              

没有与其他家庭成员的交集是NA或类似0的东西

请注意,在上述对中,第一部分的时间小于第二部分的时间。但行的顺序没有关系

1 个答案:

答案 0 :(得分:0)

重新创建数据,如下所示:

household <- c(1,1,1,1,1,2,2)
person <- c(1,1,2,3,4,1,2)
time <- strptime(c('07:45:00','09:05:00','08:10:00','22:45:00','08:30:00','07:45:00','16:45:00'), format = '%H:%M:%S')
df <- data.frame(household = household, person = person, time = time)

然后您可以在“住户”列上合并df及其自身,然后过滤人员不相同且时间在1小时以内的情况。您可以使用difftime()函数(以“小时”为单位)来获取时差:

df.merge <- merge(df, df, by = 'household')
df.merge <- df.merge[(df.merge$person.x != df.merge$person.y) & 
                         df.merge$time.x < df.merge$time.y & 
                         difftime(df.merge$time.y, df.merge$time.x, units = 'hours') <= 1,]

这将为您提供所需的设置,而没有超出1小时限制的组合。如果您确实希望NA不匹配,那么我们可以执行反连接(来自dplyr软件包),如下所示:

library(dplyr)
# rename the key columns of df.merge for easy join
colnames(df.merge) <- c('household', 'person', 'time', 'person.y', 'time.y')
# unmatched persons
unmatched_df <- anti_join(df, df.merge, by=c('household','person'))
# final set of matched and unmatched persons
bind_rows(df.merge, unmatched_df)

当然,如果时间在不同的日子,上述代码也会有问题。