小编vsa*_*dra的帖子

通过基于时间的窗口优化不规则时间序列的滚动函数

是否有某种方式使用rollapply(从zoo包装或类似的东西)优化功能(rollmean,rollmedian等)来计算与基于时间窗口的滚动功能,而不是一个基于的若干意见?我想要的很简单:对于不规则时间序列中的每个元素,我想计算一个带有N天窗口的滚动函数.也就是说,窗口应包括当前观察前N天的所有观察结果.时间序列也可能包含重复项.

以下是一个例子.鉴于以下时间序列:

      date  value
 1/11/2011      5
 1/11/2011      4
 1/11/2011      2
 8/11/2011      1
13/11/2011      0
14/11/2011      0
15/11/2011      0
18/11/2011      1
21/11/2011      4
 5/12/2011      3
Run Code Online (Sandbox Code Playgroud)

具有5天窗口的滚动中位数(右侧对齐)应导致以下计算:

> c(
    median(c(5)),
    median(c(5,4)),
    median(c(5,4,2)),
    median(c(1)),
    median(c(1,0)), 
    median(c(0,0)),
    median(c(0,0,0)),
    median(c(0,0,0,1)),
    median(c(1,4)),
    median(c(3))
   )

 [1] 5.0 4.5 4.0 1.0 0.5 0.0 0.0 0.0 2.5 3.0
Run Code Online (Sandbox Code Playgroud)

我已经找到了一些解决方案,但它们通常很棘手,通常意味着很慢.我设法实现了自己的滚动函数计算.问题是,对于非常长的时间序列,中位数(rollmedian)的优化版本可以产生巨大的时间差,因为它考虑了窗口之间的重叠.我想避免重新实现它.我怀疑rollapply参数有一些技巧可以使它工作,但我无法弄明白.在此先感谢您的帮助.

r time-series zoo

26
推荐指数
3
解决办法
2605
查看次数

使用.SD时R data.table慢聚合

我正在对data.table(优秀包!!!)进行一些聚合,我发现.SD变量对很多东西非常有用.但是,当有许多组时,使用它会显着减慢计算速度.举个例子:

# A moderately big data.table
x = data.table(id=sample(1e4,1e5,replace=T),
               code=factor(sample(2,1e5,replace=T)),
               z=runif(1e5)
              )

setkey(x,id,code)

system.time(x[,list(code2=nrow(.SD[code==2]), total=.N), by=id])
##  user  system elapsed 
##  6.226   0.000   6.242

system.time(x[,list(code2=sum(code==2), total=.N), by=id])
## user  system elapsed 
## 0.497   0.000   0.498

system.time(x[,list(code2=.SD[code==2,.N], total=.N), by=id])
## user  system elapsed 
## 6.152   0.000   6.168
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我应该避免.SD支持单个列吗?提前致谢.

r data.table

13
推荐指数
1
解决办法
2621
查看次数

merge.data.table with all = True引入了NA行.它是否正确?

在填充的data.table和另一个为空的data.table之间进行合并会在结果data.table中引入一个NA行:

a = data.table(c=c(1,2),key='c')
b = data.table(c=3,key='c')
b=b[c!=3]
b
# Empty data.table (0 rows) of 1 col: c
merge(a,b,all=T)
#     c
# 1: NA
# 2:  1
# 3:  2
Run Code Online (Sandbox Code Playgroud)

为什么?我希望它只返回data.table行a,就像merge.data.frame一样:

> merge.data.frame(a,b,all=T,by='c')
#  c
#1 1
#2 2
Run Code Online (Sandbox Code Playgroud)

r outer-join data.table

7
推荐指数
1
解决办法
9789
查看次数

标签 统计

r ×3

data.table ×2

outer-join ×1

time-series ×1

zoo ×1