首页 > 解决方案 > 配对时差最多为一小时的行

问题描述

抱歉,如果我以不同的方式提出问题,我只需要解决我的问题。我在另一列的帮助下在这里发布了时间比较

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

我在这里发布了一个类似的问题Determining at most 1 hour time 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

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

标签: rdataframe

解决方案


重新创建数据如下:

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)

当然,如果时间是在不同的日子,你会遇到上面的代码的问题。


推荐阅读