使用dplyr滚动连接

问题描述 投票:0回答:1

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

r dplyr
1个回答
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中滚动连接。

© www.soinside.com 2019 - 2024. All rights reserved.