首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R在DataTable中创建LookBack操作

R在DataTable中创建LookBack操作
EN

Stack Overflow用户
提问于 2013-09-29 12:32:16
回答 1查看 174关注 0票数 0

我想在一个数据表上做一个回看操作。我更喜欢用一个datatable来做这件事,但是还不能弄清楚如何正确地给事物起别名。我想我需要一种方法来清楚地给'join‘两边的Date列加上别名。

相反,我复制了datatable,并在其中一个数据表中更改了键列的名称,以允许回看。

这是我得到的

代码语言:javascript
复制
library(data.table)
DT <- data.table(
  Date = as.Date(c("2013-5-4", "2013-5-9", "2013-5-16", "2013-5-19","2013-5-23", "2013-5-26", "2013-5-29", "2013-6-2","2013-6-10")),
  V1 = c(1,1,1,3,4,9, 2, 3, 1)
)

下面是复制datatable、更改一个键列名称并执行回溯计算的代码

代码语言:javascript
复制
DT2<-data.table(DT) # copy the whole table
setnames(DT2,c("DDate",unlist(names(DT2)[2:length(names(DT2))]))) # changes the column name for date
# add a column in DT by looking up values in DT2
DT[, lookbackmean:=mean(DT2[DT2$DDate < .SD[,Date],V1]),by=Date][, lookback:= paste0(DT2[DT2$DDate < .SD[,Date], V1],collapse=","),by=Date]

这是输出。注意:我创建了一个名为lookback的列,该列显示每个日期的平均值。

代码语言:javascript
复制
         Date V1 lookbackmean        lookback
1: 2013-05-04  1          NaN                
2: 2013-05-09  1     1.000000               1
3: 2013-05-16  1     1.000000             1,1
4: 2013-05-19  3     1.000000           1,1,1
5: 2013-05-23  4     1.500000         1,1,1,3
6: 2013-05-26  9     2.000000       1,1,1,3,4
7: 2013-05-29  2     3.166667     1,1,1,3,4,9
8: 2013-06-02  3     3.000000   1,1,1,3,4,9,2
9: 2013-06-10  1     3.000000 1,1,1,3,4,9,2,3

我在没有创建datatable副本的情况下遇到的问题如下

将datatable连接回自身,但不计算该值。我认为问题在于它不能区分连接中的数据列。

代码语言:javascript
复制
DT[, lookbackmean:=mean(DT[DT$DDate < .SD[,Date],V1]),by=Date]
    [, lookback:= paste0(DT[DT$DDate < .SD[,Date], V1],collapse=","),by=Date]

         Date V1 lookbackmean lookback
1: 2013-05-04  1          NaN         
2: 2013-05-09  1          NaN         
3: 2013-05-16  1          NaN         
4: 2013-05-19  3          NaN         
5: 2013-05-23  4          NaN         
6: 2013-05-26  9          NaN         
7: 2013-05-29  2          NaN         
8: 2013-06-02  3          NaN         
9: 2013-06-10  1          NaN  
EN

回答 1

Stack Overflow用户

发布于 2013-09-29 13:38:21

我想我现在质疑你想要的结果:

代码语言:javascript
复制
> DT[, lookbackmean:=  head(c(NA,cumsum(V1)/(1:.N)),-1) ]
> DT
         Date V1 lookbackmean 
1: 2013-05-04  1           NA 
2: 2013-05-09  1     1.000000 
3: 2013-05-16  1     1.000000 
4: 2013-05-19  3     1.000000 
5: 2013-05-23  4     1.500000 
6: 2013-05-26  9     2.000000 
7: 2013-05-29  2     3.166667 
8: 2013-06-02  3     3.000000 
9: 2013-06-10  1     3.000000 

我猜你可能并不是真的想要累积平均值,在这种情况下,你应该看看使用索引的data.table示例的许多SO问题:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19074420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档