计算数据框列

时间:2018-04-22 22:11:25

标签: r dplyr

我已编写下面的代码,将加权函数应用于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

1 个答案:

答案 0 :(得分:1)

试试这个:

DF %>% mutate(weighted = rollapplyr(rand, 5, crossprod, weights, fill = NA))