我已编写下面的代码,将加权函数应用于rand
列。 rollsum_rand
的计算有一个很好的紧凑符号。是否有类似的方法为rollsum_rand_weighted
执行此操作,这将比下面的代码更紧凑和可扩展?例如,如果我希望窗口长度为10
,则需要进行一些手动重新编码,我想避免这种情况。如果可能,我希望保留dplyr
兼容代码。
library(dplyr)
library(zoo)
weights <- exp(1:5) / exp(5)
data.frame(rand = rnorm(5*20) ) %>%
mutate(rollsum_rand = rollsum(x = rand, 5, align = "right", fill = NA) ) %>%
mutate(rollsum_rand_weighted = weights[5] * rand +
weights[4] * lag(x=rand, n=1) +
weights[3] * lag(x=rand, n=2) +
weights[2] * lag(x=rand, n=3) +
weights[1] * lag(x=rand, n=4)
)
这给出了结果:
rand rollsum_rand rollsum_rand_weighted
1 -0.270520763 NA NA
2 -0.630596660 NA NA
3 0.235524718 NA NA
4 -0.186220201 NA NA
5 -1.694303918 -2.54611682 -1.76728602
6 0.614248631 -1.66134743 -0.03407681
7 0.969988049 -0.06076272 0.96170082
8 0.279189752 -0.01709769 0.63139276
9 -0.009162437 0.15996008 0.22436872
10 0.395993700 2.25025770 0.48995047
答案 0 :(得分:1)
试试这个:
DF %>% mutate(weighted = rollapplyr(rand, 5, crossprod, weights, fill = NA))