R data.table的奇怪换档/滞后结果
考虑下表a,其中包含人员编号、日期(以年为单位)和数据R data.table的奇怪换档/滞后结果,r,data.table,R,Data.table,考虑下表a,其中包含人员编号、日期(以年为单位)和数据 a = data.table(person = c(1,1,1,2,3,3,3,4,4,5,5,5,5,5), date = c(2010,2011,2012,2010,2010,2011,2012,2010,2011,2010,2011,2012,2013,2014), data = c(9,7,6,4,3,3,5,1,6,5,7,8,4,9)) 我想按人移动“日期”,所以我要: a <- a[order(date)] a[, d
a = data.table(person = c(1,1,1,2,3,3,3,4,4,5,5,5,5,5), date = c(2010,2011,2012,2010,2010,2011,2012,2010,2011,2010,2011,2012,2013,2014), data = c(9,7,6,4,3,3,5,1,6,5,7,8,4,9))
我想按人移动“日期”,所以我要:
a <- a[order(date)]
a[, date := shift(date, 1L, type = "lag"), by=.(person)]
person date data
1: 1 NA 9
2: 2 NA 4
3: 3 NA 3
4: 4 NA 1
5: 5 NA 5
6: 1 2010 7
7: 3 2010 3
8: 4 2010 6
9: 5 2010 7
10: 1 2011 6
11: 3 2011 5
12: 5 2011 8
13: 5 2012 4
14: 5 2013 9
再次执行换档操作的奇怪输出给出:
person date data
1: 1 2010 6
2: 3 2010 5
3: 5 2010 8
4: 4 2010 1
5: 5 2011 4
6: 1 2011 9
7: 3 2011 3
8: 5 2012 9
9: 5 2013 5
10: 1 NA 7
11: 3 NA 3
12: 4 NA 6
13: 5 NA 7
14: 2 NA 4
这似乎是在重复观察?删除第二次重新分配并
订购
呼叫<代码>订单(日期)将NA
值放在末尾shift
只取一个向量,因为NA
值现在位于末尾,所以它们被shift
导出,而不是您期望的date
值:
或者,在您的order
调用中,您可以使用na.last
参数,即警告:包“data.table”是在R版本3.4.4下构建的
a=数据表(person=c(1,1,1,2,3,3,4,4,5,5,5,5),date=c(2010201120102010201120102010201120102011201120012012014),data=c(9,7,6,4,3,3,5,1,6,5,7,8,4,9))
个人日期数据
#>1:1 NA 9
#>2:2 NA 4
#>3:3-3
#>4:4 NA 1
#>5:5 NA 5
#> 6: 1 2010 7
#> 7: 3 2010 3
#> 8: 4 2010 6
#> 9: 5 2010 7
#> 10: 1 2011 6
#> 11: 3 2011 5
#> 12: 5 2011 8
#> 13: 5 2012 4
#> 14: 5 2013 9
#注意,我在这里并没有重新分配,只是为了演示的目的而显示
#注意不适用的位置
a[订单(日期),]
#>人员日期数据
#> 1: 1 2010 7
#> 2: 3 2010 3
#> 3: 4 2010 6
#> 4: 5 2010 7
#> 5: 1 2011 6
#> 6: 3 2011 5
#> 7: 5 2011 8
#> 8: 5 2012 4
#> 9: 5 2013 9
#>10:1 NA 9
#>11:2 NA 4
#>12:3 NA 3
#>13:4 NA 1
#>14:5 NA 5
#你期望看到什么
a[,日期:=班次(日期,1L,type=“lag”),由=(人)]
a[]
#>人员日期数据
#>1:1 NA 9
#>2:2 NA 4
#>3:3-3
#>4:4 NA 1
#>5:5 NA 5
#>6:1 NA 7
#>7:3 NA 3
#>8:4-6
#>9:5-7
#> 10: 1 2010 6
#> 11: 3 2010 5
#> 12: 5 2010 8
#> 13: 5 2011 4
#> 14: 5 2012 9
由(v0.2.1)于2019-04-24创建,如果您想再次执行移位操作,则需要使用a,因此这意味着shift()在看到NA时会被卡住?我不确定您所说的“卡住”是什么意思-它正在做它应该做的事情(移动向量)。我也更新了我的答案,您还可以使用
na.last
参数并将其设置为FALSE
,这将导致您预期的行为。
person date data
1: 5 2010 9
2: 1 2010 7
3: 3 2010 3
4: 5 2011 5
5: 5 2012 7
6: 1 NA 6
7: 3 NA 5
8: 5 NA 8
9: 4 NA 1
10: 5 NA 4
11: 1 NA 9
12: 3 NA 3
13: 4 NA 6
14: 2 NA 4
person date data
1: 1 2010 6
2: 3 2010 5
3: 5 2010 8
4: 4 2010 1
5: 5 2011 4
6: 1 2011 9
7: 3 2011 3
8: 5 2012 9
9: 5 2013 5
10: 1 NA 7
11: 3 NA 3
12: 4 NA 6
13: 5 NA 7
14: 2 NA 4