2014-04-16 32 views
0

我有一个小麻烦理解data.table下列行为......需要帮助了解[R data.table行为

##Combine into one data.table 
RecordNo <- 1:36 
Record_Date <- c(31,33,38,41,44,59,68,69,75,78,85,88, 
         32,34,45,46,51,54,60,65,67,70,74,80, 
         33,35,42,45,50,60,65,70,75,80,82,85) 
Cust_ID <- c(rep(1,12),rep(2,12),rep(3,12)) 
data <- data.table(RecordNo,Record_Date,Cust_ID) 

##Create "list" of comparison dates 
data[,list(Compare_Date=list(Record_Date)),by=c("Cust_ID")] 

    Cust_ID  Compare_Date 
1:  1 33,35,42,45,50,60, 
2:  2 33,35,42,45,50,60, 
3:  3 33,35,42,45,50,60, 

上面的代码输出CUST_ID = 3的每个日期列表CUST_ID。我希望像这样的输出..

Cust_ID  Compare_Date 
1:  1 31,33,38,41,44,59, 
2:  2 32,34,45,46,51,54, 
3:  3 33,35,42,45,50,60, 

任何想法,为什么data.table将返回日期为CUST_ID 3,而不是每个CUST_ID值的正确列表清单?

sessionInfo() 

R version 3.1.0 beta (2014-03-28 r65330) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.9.2 

loaded via a namespace (and not attached): 
[1] plyr_1.8.1  Rcpp_0.11.0 reshape2_1.2.2 stringr_0.6.2 tools_3.1.0 
+0

您所需的输出。您可能需要清理工作区并复制/粘贴可重现的代码,以查看是否遇到同样的问题。 – BrodieG

+0

同样在这里,运行dt 1.9.3 – eddi

+0

很奇怪。它仍在起作用。也许我会尝试卸载,然后重新安装data.table。 –

回答

1

更新:行为DT[, list(list(.)), by=.]有时会导致中的R版本> = 3.1.0错误的结果。现在在data.table v1.9.3的当前开发版本中现在修复了commit #1280。从NEWS

  • DT[, list(list(.)), by=.]回报中的R正确结果> = 3.1.0为好。该错误是由于R v3.1.0中最近(欢迎)的更改造成的,其中list(.)未导致副本。关闭#481

用此修复程序,没有必要为I()了。


似乎工作,如果我把在“我”的名单之前,我得到

##Create "list" of comparison dates 
data[,list(Compare_Date=list(I(Record_Date))),by=c("Cust_ID")]