data.table shift возвращает неправильные значения - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть данные, как показано ниже:

# DT
           ID STATE      NAME YEAR      POPULATION 
 1: 100325240    AL  FAIRHOPE 2007           16985 
 2: 100325240    AL  FAIRHOPE 2008           17134       
 3: 100325240    AL  FAIRHOPE 2009           16185   
 4: 100325240    AL  FAIRHOPE 2010           16409    
 5: 100325240    AL  FAIRHOPE 2011           16588       
 6: 100325240    AL  FAIRHOPE 2012           14184          
 7: 100325240    AL  FAIRHOPE 2013           16385            
 8: 100325240    AL  FAIRHOPE 2014           16794          
 9: 100325240    AL  FAIRHOPE 2015           18089           
10: 100524568    AL   EUFAULA 1996           13220
11: 100524568    AL   EUFAULA 1997           13220              
12: 100524568    AL   EUFAULA 1998           13220           
13: 100524568    AL   EUFAULA 1999           13220          
14: 100524568    AL   EUFAULA 2000           13220            
15: 100524568    AL   EUFAULA 2001           13908           
16: 100524568    AL   EUFAULA 2002           13908             
17: 100524568    AL   EUFAULA 2003           13908            
18: 100524568    AL   EUFAULA 2004           13908            
19: 100524568    AL   EUFAULA 2005           13908           
20: 100524568    AL   EUFAULA 2006           13463           

Я хочу, чтобы данные отставали по группам.
После того, как я манипулирую с помощью shift, получается странно.

library(data.table)
DT[, POPULATION_TM1 := shift(POPULATION, -1), by = .(ID, STATE, NAME)]

           ID STATE      NAME YEAR      POPULATION      POPULATION_TM1
 1: 100325240    AL  FAIRHOPE 2007           16985 9218868437227407266
 2: 100325240    AL  FAIRHOPE 2008           17134               16985
 3: 100325240    AL  FAIRHOPE 2009           16185               17134
 4: 100325240    AL  FAIRHOPE 2010           16409               16185
 5: 100325240    AL  FAIRHOPE 2011           16588               16409
 6: 100325240    AL  FAIRHOPE 2012           14184               16588
 7: 100325240    AL  FAIRHOPE 2013           16385               14184
 8: 100325240    AL  FAIRHOPE 2014           16794               16385
 9: 100325240    AL  FAIRHOPE 2015           18089               16794
10: 100524568    AL   EUFAULA 1996           13220 9218868437227407266
11: 100524568    AL   EUFAULA 1997           13220               13220
12: 100524568    AL   EUFAULA 1998           13220               13220
13: 100524568    AL   EUFAULA 1999           13220               13220
14: 100524568    AL   EUFAULA 2000           13220               13220
15: 100524568    AL   EUFAULA 2001           13908               13220
16: 100524568    AL   EUFAULA 2002           13908               13908
17: 100524568    AL   EUFAULA 2003           13908               13908
18: 100524568    AL   EUFAULA 2004           13908               13908
19: 100524568    AL   EUFAULA 2005           13908               13908
20: 100524568    AL   EUFAULA 2006           13463               13908

Я не знаю, почему получается 9218868437227407266, а не NA.Я даже не могу найти в данных 9218868437227407266.
Как это исправить?
В DT содержится более 36000 наблюдений.

> sessioninfo::session_info()
- Session info ------------------------------------------------------------- ------------------------------------------
 setting  value                       
 version  R version 3.5.1 (2018-07-02)
 os       Windows >= 8 x64            
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        
 collate  English_United States.1252  
 ctype    English_United States.1252  
 tz       America/New_York            
 date     2019-02-10                  

- Packages -----------------------------------------------------------------------------------------------------------
 package     * version date       lib source
 data.table  * 1.11.8  2018-09-30 [1] CRAN (R 3.5.1)


> dput(head(DT, 20))
structure(list(ID = structure(c(4.95672544947781e-316, 4.95672544947781e-316, 
4.95672544947781e-316, 4.95672544947781e-316, 4.95672544947781e-316, 
4.95672544947781e-316, 4.95672544947781e-316, 4.95672544947781e-316, 
4.95672544947781e-316, 4.96657356118323e-316, 4.96657356118323e-316, 
4.96657356118323e-316, 4.96657356118323e-316, 4.96657356118323e-316, 
4.96657356118323e-316, 4.96657356118323e-316, 4.96657356118323e-316, 
4.96657356118323e-316, 4.96657356118323e-316, 4.96657356118323e-316
), class = "integer64"), STATE = c("AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL"), NAME = c("FAIRHOPE", "FAIRHOPE", 
"FAIRHOPE", "FAIRHOPE", "FAIRHOPE", "FAIRHOPE", "FAIRHOPE", "FAIRHOPE", 
"FAIRHOPE", "EUFAULA", "EUFAULA", "EUFAULA", "EUFAULA", "EUFAULA", 
"EUFAULA", "EUFAULA", "EUFAULA", "EUFAULA", "EUFAULA", "EUFAULA"
), YEAR = c(2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 
2014L, 2015L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 
2003L, 2004L, 2005L, 2006L), POPULATION = structure(c(8.39170499461357e-320, 
8.46532077584392e-320, 7.99645247794058e-320, 8.10712318260901e-320, 
8.1955609332146e-320, 7.00782712061224e-320, 8.09526560710882e-320, 
8.29733845625789e-320, 8.93715346762231e-320, 6.53154783802128e-320, 
6.53154783802128e-320, 6.53154783802128e-320, 6.53154783802128e-320, 
6.53154783802128e-320, 6.87146500236006e-320, 6.87146500236006e-320, 
6.87146500236006e-320, 6.87146500236006e-320, 6.87146500236006e-320, 
6.6516057899607e-320), class = "integer64"), POPULATION_TM1 = 
structure(c(NA, 
8.39170499461357e-320, 8.46532077584392e-320, 7.99645247794058e-320, 
8.10712318260901e-320, 8.1955609332146e-320, 7.00782712061224e-320, 
8.09526560710882e-320, 8.29733845625789e-320, NA, 6.53154783802128e-320, 
6.53154783802128e-320, 6.53154783802128e-320, 6.53154783802128e-320, 
6.53154783802128e-320, 6.87146500236006e-320, 6.87146500236006e-320, 
6.87146500236006e-320, 6.87146500236006e-320, 6.87146500236006e-320
), class = "integer64")), class = c("data.table", "data.frame"
), row.names = c(NA, -20L), .internal.selfref = <pointer: 
0x0000000005e51ef0>)

После обновления последней версии R и data.table

> sessioninfo::session_info()
- Session info -------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.5.2 (2018-12-20)
 os       Windows >= 8 x64            
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        
 collate  English_United States.1252  
 ctype    English_United States.1252  
 tz       America/New_York            
 date     2019-02-10                  

- Packages -----------------------------------------------------------------------------------------------------------
 package     * version date       lib source        
 assertthat    0.2.0   2017-04-11 [1] CRAN (R 3.5.1)
 cli           1.0.0   2017-11-05 [1] CRAN (R 3.5.1)
 crayon        1.3.4   2017-09-16 [1] CRAN (R 3.5.1)
 data.table  * 1.12.0  2019-01-13 [1] CRAN (R 3.5.2)
 rstudioapi    0.8     2018-10-02 [1] CRAN (R 3.5.1)
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.5.2)
 withr         2.1.2   2018-03-15 [1] CRAN (R 3.5.1)
 yaml          2.2.0   2018-07-25 [1] CRAN (R 3.5.2)

После загрузки последней версии R и data.table, это приводит к тому, что сеанс RSdutio R перестал работать .A problem caused the program to stop working correctly. Please close the program.
Если я использую небольшой набор данных, он работает.Тем не менее, есть 36066 obs.из 231 переменной в моем DT.Я не уверен, влияет ли это или нет.Однако я просто добавляю одну новую переменную POPULATION_TM1 с функцией shift, не манипулируя другими.
Я думаю, что проблема не в переменной.Проблема в 36066 об.После того, как я удалил другие переменные и запустился, он все равно завершил работу моего Rstudio.

...