使用dplyr滚动连接

时间:2018-03-02 15:31:48

标签: r dplyr

前几天有人发推文说dplyr现在支持不等式连接(“滚动连接”),但CRAN上的版本没有提到这一点。任何指针赞赏。

1 个答案:

答案 0 :(得分:2)

据我所知,在dplyr中没有这样的单一函数,但假设你所指的是SQL中显示的这个复杂连接,对于任何行,我计算那些时间点介于两者之间的行的平均需求Time[i]-2Time[i]

library(sqldf)
sqldf("select a.Time, a.demand demand, avg(b.demand) mean_demand 
       from BOD a join BOD b on b.Time between a.Time - 2 and a.Time
       group by a.Time")

那么这可以在dplyr和tidyr这样做(虽然它确实有明显的缺点,它形成了完整的n x n交叉连接,然后将其过滤掉)。

library(dplyr)
library(tidyr)
BOD %>% 
    expand(., ., .) %>% 
    group_by(Time, demand) %>% 
    filter(Time1 <= Time & Time1 >= Time-2) %>% 
    summarize(mean_demand = mean(demand1)) %>%
    ungroup

也可以像zoo::rollapplyr这样完成。这里Avg是一个函数,它采用行号ix的向量,并为那些时间至少为demand的输入行返回max(Time[ix])-2的平均值。我们使用该函数在行号上rollapplyr

library(zoo)
Avg <- function(ix) with(BOD[ix, ], mean(demand[Time >= max(Time) - 2]))
transform(BOD, Avg = rollapplyr(1:nrow(BOD), 3, Avg, partial = TRUE))

或者如果您只想要最近的3行而不管它们的时间,那么它就更容易了:

transform(BOD, Avg = rollapplyr(demand, 3, mean, partial = TRUE))

另请参阅this link了解data.table中的滚动连接。