2015-01-20 62 views
3

嗨我想創建一個data.table與滯後變量組ID。某些id在data.table中只有一行,在這種情況下,lag的移位運算符會給出錯誤,但前導運算符工作正常。下面是一個例子data.table滯後運算符拋出錯誤

dt = data.table(id = 1, week = as.Date('2014-11-11'), sales = 1) 
lead = 2 
lag = 2 
lagSalesNames = paste('lag_sales_', 1:lag, sep = '') 
dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lag'), by = list(id)] 

這給了我下面的錯誤

All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead 
(much quicker), or cbind or merge afterwards. 

但如果我嘗試同樣的事情用鉛代替,它工作正常

dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lead'), by = list(id)] 

這也似乎工作如果data.table有超過1行,例如你可以嘗試以下兩行工作正常

dt = data.table(id = 1, week = as.Date(c('2014-11-11', '2014-11-11')), sales = 1:2) 
dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lag'), by = list(id)] 

我在R版本3.1.0的Linux機器上使用data.table版本1.9.5。任何幫助將非常感激。

感謝, 阿信

+0

這是很奇怪的行爲。如果我連續運行它3次,它會在前兩次運行,然後在最後一次嘗試中返回一個錯誤。 – 2015-01-20 20:32:53

+0

是的,我也遇到一些奇怪的行爲。例如,對於某些情況,代碼運行lag = 2,但是如果我將lag = 6引發了分段錯誤 – 2015-01-20 20:58:57

+0

感謝Arun查看它。 – 2015-01-20 22:59:44

回答

2

感謝您的報告。這現在是固定的(問題#1014)與commit #1722data.table v1.9.5。

現在按預期工作:

dt 
# id  week sales lag_sales_1 lag_sales_2 
# 1: 1 2014-11-11  1   NA   NA 
+1

感謝您的快速轉身。 – 2015-01-21 13:20:37

+1

非常感謝Arun和David,非常感謝。 – 2015-01-22 18:32:03