r - 配对时差最多为一小时的行
问题描述
抱歉,如果我以不同的方式提出问题,我只需要解决我的问题。我在另一列的帮助下在这里发布了时间比较
现在我想让它更简单,以便有人给我答案。
我在这里发布了一个类似的问题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
请注意,在上述对中,第一部分的时间小于第二部分。但行的顺序无关紧要
解决方案
重新创建数据如下:
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)
当然,如果时间是在不同的日子,你会遇到上面的代码的问题。
推荐阅读
- javascript - 本地主机上的 Google API 密钥限制
- reactjs - 自定义 React Native Carousel 的解决方案,例如示例图像
- batch-file - 根据部分名称将文件移动到文件夹中,但不先创建文件夹
- android - Glide 无法将图像下载到 ImageView
- go - 将结构字段转换为字符串
- android - CryptographyManager 使用的 secretKeyName 是什么?
- c++ - 我不知道为什么它不打印链接列表
- vue.js - 从 vue.js 中的 slot 访问组件数据(没有在郊区声明模板)
- reactjs - 使用 ThreeJS 和 React 三纤执行 React 应用程序时出现“编译失败”错误
- python - python sort numpy ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()