4

我在 data.table 中遇到了一个奇怪的错误消息

我使用 修改了一个 data.table :=,它完全没问题,没有任何错误。当我尝试将代码放入函数时,会出现以下错误消息。

Error in `:=`(date, as.Date(as.character(date), "%Y%m%d") - 1) : 
:= and `:=`(...) are defined for use in j, once only and in particular ways. See     help(":="). Check is.data.table(DT) is TRUE.

这是可重现的示例

testdat <- data.table(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
# The single line command works fine. 
testdat[, date := as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
# But if I wrote them into a function, it failed. 
# ( In this case, it worked as well.. So I got totally lost. ) 
test2 <- data.frame(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
readdata <- function(fn){
      DT <- data.table(fn)
      DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
      return(DT)
}

为了更好地描述,我将部分原始代码放在这里。所以你可能明白哪里出了问题。

readdata <- function(fn){
   DT <- fread(fn, sep=",")
   # DT <- fread("1202.txt")
   setnames(DT, paste0("V",c(1:12)), column_names)
   # Modification on date
   setkey(DT,uid)
   DT[,date := as.Date(as.character(date),"%Y%m%d") - 1][, ignore:= NULL] #ignore is the name of one column
...}

我有一个 txt 文件列表,我想为每个文件进行计算。第一步是使用 fread,并逐个进行。假设现在我想根据“1202.txt”文件进行计算。如果我从开始DT <- fread("1202.txt")然后继续。它不会出现这个错误。

如果我想使用readdata("1202.txt") 错误信息就出来了。最奇怪的是,我使用readdata之前没有任何错误。

那么这里发生了什么?有什么建议么?谢谢。

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

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

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

loaded via a namespace (and not attached):
[1] tools_3.0.2

编辑

经过一些试验,我发现如果我修改代码如下,它可以工作

   readdata <- function(fn){
   DT <- fread(fn, sep=",")
   DT <- data.table(DT) ## Just add this line compared to the original one.
   # DT <- fread("1202.txt")
   setnames(DT, paste0("V",c(1:12)), column_names)
   # Modification on date
   setkey(DT,uid)
   DT[,date := as.Date(as.character(date),"%Y%m%d") - 1][, ignore:= NULL] #ignore is the name of one column
...}

那么错误是由于fread引起的吗?fread之后应该是data.table。为什么我需要使用 data.table(DT) 来转换它?

编辑

感谢关注。这是 2014 年 2 月 4 日的更新

我首先卸载了我的 1.8.11,并按照 Matt 的说明进行操作。再次从 CRAN 安装 1.8.10,然后一步一步按照他的代码。结果完全没问题,没有任何错误。

然后我卸载了 1.8.11,然后尝试使用预编译的 zip 文件再次安装 1.8.11。

像往常一样,有一条警告消息:

> install.packages("~/Desktop/data.table_1.8.11.zip", repos = NULL)
Warning in install.packages :
package ~/Desktop/data.table_1.8.11.zip?is not available (for R version 3.0.2)
Installing package into C:/Users/James/R/win-library/3.0?(as lib?is unspecified)
package data.table?successfully unpacked and MD5 sums checked

> require(data.table)
Loading required package: data.table
data.table 1.8.11  For help type: help("data.table")

看来警告信息是错误的,我加载包时完全可以。而此时,整个过程完全没问题。感谢 Matt、Arun 和所有其他热心人士的耐心。我是 data.table 的初学者。真的很感激你的好意。

还有一件事,正如我已经在此链接中报告的那样,但仍未解决。

> ?melt.data.table
No documentation for 憁elt.data.table?in specified packages and libraries:
you could try ??melt.data.table?

实在是太可惜了。有任何想法吗?

我在该链接中报告了我的 sessionInfo。我用的是Win8.1 64bit

4

2 回答 2

5

重新安装 data.table v1.8.10 / v1.8.11 后(我尝试了两个版本),并重新启动了一个新的 R 会话。问题解决了。

原来我的问题是由安装了 5 个月大的开发版本引起的。

data.table主页有点误导:

最后推荐的 Windows 预编译快照:v1.8.11 rev931 2013 年 9 月 4 日

[主页][1] 已改进,现在显示为:

install.packages("data.table", repos="http://R-Forge.R-project.org")
或者,如果失败,复制到此主页的最后一个 Windows 预编译 .zip 可能就足够了:v1.8.11 rev1110 2014 年 2 月 4 日

感谢大家提供宝贵的答案和意见。

于 2014-02-04T12:07:26.130 回答
3

(这对于评论来说太长了,所以我把它作为答案)。我无法重现您的错误。(也许一些 data.table 专家可以给你更好的解释)。这对我来说很好:

readdata <- function(fn){
  DT <- fread(fn)   ## no need to put a sep here, fread guess it
  DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
  return(DT)
}

write.csv(test2,'test2.csv',row.names=F)  ## fread works better without rownames
 readdata('test2.csv')
    ID       date
 1:  1 2012-12-31
 2:  2 2012-12-31
 3:  3 2012-12-31
 4:  4 2012-12-31
 5:  5 2012-12-31
 6:  6 2012-12-31
 7:  7 2012-12-31
 8:  8 2012-12-31
 9:  9 2012-12-31
10: 10 2012-12-31

[从马特编辑]我也无法复制。根据评论,这正是我所做的。你的有什么不同?

$ R
R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

> require(data.table)
Loading required package: data.table
data.table 1.8.10  For help type: help("data.table")
> test2 <- data.frame(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
> test2
   ID     date      Number
1   1 20130101  0.26937712
2   2 20130101  0.72113244
3   3 20130101 -0.66086356
4   4 20130101  0.47507096
5   5 20130101  0.69400777
6   6 20130101 -1.26948436
7   7 20130101  1.75919781
8   8 20130101 -0.05306206
9   9 20130101  1.59880358
10 10 20130101  0.69531516
> write.csv(test2,'test2.csv',row.names=FALSE)
> readdata <- function(fn){
+   DT <- fread(fn)
+   DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
+   return(DT)
+ }
> readdata("test2.csv")
    ID       date
 1:  1 2012-12-31
 2:  2 2012-12-31
 3:  3 2012-12-31
 4:  4 2012-12-31
 5:  5 2012-12-31
 6:  6 2012-12-31
 7:  7 2012-12-31
 8:  8 2012-12-31
 9:  9 2012-12-31
10: 10 2012-12-31
> 
于 2014-02-02T12:45:55.663 回答