R data.table的奇怪换档/滞后结果

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,其中包含人员编号、日期(以年为单位)和数据

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