【问题标题】:Need Help Understanding r data.table Behavior需要帮助了解 r data.table 行为
【发布时间】:2014-04-16 21:49:30
【问题描述】:

我在理解 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 输出 Cust_ID=3 的日期列表。我想要这样的输出..

   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 

【问题讨论】:

  • 我得到了你想要的输出。您可能想清除工作区并复制/粘贴可重现的代码,看看是否遇到同样的问题。
  • 这里一样,运行 dt 1.9.3
  • 很奇怪。它仍在发挥作用。也许我会尝试卸载然后重新安装 data.table。
  • 您运行的是 R v3.1.0 吗?那么这是一个new bug 尚未修复。暂时使用this comment 下的修复程序。
  • 对不起...我还是个新手。如何在此评论下标记“修复”?

标签: r 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")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多