加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在data.table中添加延迟并导致每个观察结果中的更多变量排除

发布时间:2020-12-14 05:31:43 所属栏目:Windows 来源:网络整理
导读:我有一个类似这样的data.table: library(data.table)mydt - data.table(id = LETTERS[1:6],x = 1:6,y = 2:3) mydt id x y1: A 1 22: B 2 33: C 3 24: D 4 35: E 5 26: F 6 3 我想用增加滞后的值替换值列,并导致每次观察(即x [-1] x x [1]).我可以使用惊人的
我有一个类似这样的data.table:

library(data.table)
mydt <- data.table(id = LETTERS[1:6],x = 1:6,y = 2:3) 
> mydt
   id x y
1:  A 1 2
2:  B 2 3
3:  C 3 2
4:  D 4 3
5:  E 5 2
6:  F 6 3

我想用增加滞后的值替换值列,并导致每次观察(即x [-1] x x [1]).我可以使用惊人的shift()功能做这样的事情.

cols <- c('x','y')
mydt[,(cols) := shift(.SD,1) + .SD + shift(.SD,1,type = 'lead'),.SDcols = cols
][]
   id  x  y
1:  A NA NA
2:  B  6  7
3:  C  9  8
4:  D 12  7
5:  E 15  8
6:  F NA NA

但是这会为没有超前/滞后值的行引入NA.如何修改计算以仅对这些行使用可用的两个值(如na.rm = TRUE)?这样输出就可以了

id  x  y
1:  A  3  5
2:  B  6  7
3:  C  9  8
4:  D 12  7
5:  E 15  8
6:  F 11  5

我尝试使用sum(…,na.rm = TRUE)而不是运算符,但这给出了错误:总和错误(shift(.SD,1),. SD,shift(.SD,type =“lead) “),na.rm = TRUE):
??参数的’type'(列表)无效.

我也试过以下但是显然会给出其他的东西.

mydt[,(cols) := lapply(
        .SD,function(x) sum(shift(x,x,shift(x,na.rm = TRUE)
    ),.SDcols = cols
][]
   id   x  y
1:  A 126 90
2:  B 126 90
3:  C 126 90
4:  D 126 90
5:  E 126 90
6:  F 126 90

解决方法

正如@akrun和@DavidArenburg指出的那样,shift函数有一个填充参数来解决问题.

cols <- c('total_open','total_send')
mydt[,fill = 0) + .SD + shift(.SD,type = 'lead',fill = 0),.SDcols = cols
][]
   id  x y
1:  A  3 5
2:  B  6 7
3:  C  9 8
4:  D 12 7
5:  E 15 8
6:  F 11 5

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读