很抱歉,如果我以其他方式提出问题,我只需要解决我的问题即可。我已经在这里发布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的东西
请注意,在上述对中,第一部分的时间小于第二部分的时间。但行的顺序没有关系
答案 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)
当然,如果时间在不同的日子,上述代码也会有问题。