前几天有人发推文说dplyr
现在支持不等式连接(“滚动连接”),但CRAN上的版本没有提到这一点。任何指针赞赏。
答案 0 :(得分:2)
据我所知,在dplyr中没有这样的单一函数,但假设你所指的是SQL中显示的这个复杂连接,对于任何行,我计算那些时间点介于两者之间的行的平均需求Time[i]-2
和Time[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中的滚动连接。