在两个数据框上使用ifelse

时间:2017-09-13 18:05:56

标签: r dplyr

我正在尝试使用ifelse条件在我的数据框架中创建一个新列:

假设有两个数据帧A和B,它们都有日期和时间列。

如果A中的日期与B中的日期匹配且A的时间中的日期等于B的时间中的匹配日期或B的时间中的匹配日期低于A中的下一行的时间,则为TRUE,否则为FALSE。

我希望这很清楚..到目前为止,我已经尝试了类似的东西

A %>% mutate(DFT = ifelse(Dayt == B$date & Tyme == B$time | 
                          Tyme > Time[which(Dayt == B$date & Tyme ==B$time) +1], 
    B[which(which(Dayt == B$date & Tyme ==B$time) +1])], NA))

这段代码可能不起作用,但我希望它能让我知道我想要实现的目标。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

可重复的例子

set.seed(1)
A = data.frame(
  date=seq(as.Date("2017/1/1"), as.Date("2017/1/10"), "days"))
B = data.frame(date=seq(as.Date("2017/1/2"), as.Date("2017/1/9"), "days"))
A$time <- sample(1:3,length(A$date),TRUE)
B$time <- sample(1:3,length(B$date),TRUE)

 A   
      date time
 1: 2017-01-01    1
 2: 2017-01-02    2
 3: 2017-01-03    2
 4: 2017-01-04    3
 5: 2017-01-05    1
 6: 2017-01-06    3
 7: 2017-01-07    3
 8: 2017-01-08    2
 9: 2017-01-09    2
10: 2017-01-10    1

B
         date time
1: 2017-01-02    1
2: 2017-01-03    1
3: 2017-01-04    3
4: 2017-01-05    2
5: 2017-01-06    3
6: 2017-01-07    2
7: 2017-01-08    3
8: 2017-01-09    3

溶液

这是一个解决方案,首先我按日期合并然后使用时间条件进行过滤。

library(data.table)
setDT(A)
setDT(B)

merge(A,B,by="date")[time.x==time.y | time.y==c(tail(time.x,-1),NA)]

        date time.x time.y
1: 2017-01-04      3      3
2: 2017-01-06      3      3
3: 2017-01-07      3      2