我有2个数据帧,A和B:
A
abc|def|datetime |
1 |55 |2016-01-28 00:00:00 |
2 |53 |2016-01-28 00:30:00 |
3 |11 |2016-01-28 02:00:00 |
B
efg|hij|datetime |
4 |ch |2016-01-28 00:11:00 |
5 |jw |2016-01-28 11:30:00 |
6 |q1 |2016-01-28 07:00:00 |
如果值B在一个小时后,我想在A的末尾添加一个真假列。还有一个显示值B的列在一个小时前。
输出:
abc|def|datetime |After|Before|
1 |55 |2016-01-28 00:00:00 | 0 | 1 |
2 |53 |2016-01-28 00:30:00 | 1 | 0 |
3 |11 |2016-01-28 02:00:00 | 0 | 0 |
我尝试使用`library(lubridate):
for(i in seq(nrow(B))){
for(j in seq(nrow(A))){
if(A$datetime[j] %in% seq(B$datetime[i],B$datetime[i] + hours(1))){
A$After[j] = 1
}
}
}
但是我无法使它正常工作。任何帮助将不胜感激。
其他信息:
数据帧未对齐,我想确定B中是否有任何情况在A之后或之前一个小时之内。如果是这种情况,则在该列中添加1。例如:
4 |ch |2016-01-28 00:11:00 |
在1 |55 |2016-01-28 00:00:00 |
之后
4 |ch |2016-01-28 00:11:00 |
在2 |53 |2016-01-28 00:30:00 |
之前
B是一个事件,我想确定与A有关的事件。
答案 0 :(得分:1)
根据其他信息编辑的问题。在这种情况下,它稍微容易一些。您可以使用lubridate中的函数来查找日期时间是否在2个日期之间。为此,您需要2个功能。首先创建一个时间间隔对象,然后使用%within%
函数查找日期是否落在一个时间间隔内。
在下面的代码中,我创建了两个时间间隔对象,之前和之后。要检查B的每个值是否落在一个间隔中,我们需要运行一个循环。
library(lubridate)
after_interval <- as.interval(3600, A$datetime)
# flip interval to get lower date first in the interval
before_interval <- int_flip(as.interval(-3600, A$datetime))
for(i in seq_along(length(B$datetime))) {
After <- B$datetime[i] %within% after_interval
After = as.integer(After)
if(i == 1){
AfterLoop = After
} else {
AfterLoop = AfterLoop + After}
Before <- B$datetime[i] %within% before_interval
Before = as.integer(Before)
if(i == 1){
BeforeLoop = Before
} else {
BeforeLoop = BeforeLoop + Before}
}
A$After <- AfterLoop
A$Before <-BeforeLoop
A
abc def datetime After Before
1 1 55 2016-01-28 00:00:00 TRUE FALSE
2 2 53 2016-01-28 00:30:00 FALSE TRUE
3 3 11 2016-01-28 02:00:00 FALSE FALSE