R 使用`by`子句时在data.table中分派S3方法
更新:这似乎是data.table版本1.9.4的问题,而不是软件包的最新版本(截至本文撰写时为1.9.6) 我有一张表格,我通过R 使用`by`子句时在data.table中分派S3方法,r,data.table,R,Data.table,更新:这似乎是data.table版本1.9.4的问题,而不是软件包的最新版本(截至本文撰写时为1.9.6) 我有一张表格,我通过fread阅读,如下所示: library(data.table) library(bit64) dt = fread('"x","y"\n2489751247,"a"\n2492940518,"b"\n2444706811,"a"\n2408767228,"b"') :> x y :> 1: 2489751247 a :&g
fread
阅读,如下所示:
library(data.table)
library(bit64)
dt = fread('"x","y"\n2489751247,"a"\n2492940518,"b"\n2444706811,"a"\n2408767228,"b"')
:> x y
:> 1: 2489751247 a
:> 2: 2492940518 b
:> 3: 2444706811 a
:> 4: 2408767228 b
我想要x
的和,条件是y
,但是data.table给出了错误的答案:
dt[,.(total=sum(x)),by=y]
:> y total
:> 1: a 2.437946e-314
:> 2: b 2.421765e-314
没有礼貌的警告信息。结果表明,x属于integer64类:
lapply(dt,class)
:> $x
:> [1] "integer64"
:> $y
:> [1] "character"
因此,我可以手动执行s3调度,如下所示:
dt[,.(total=sum.integer64(x)),by=y]
:> y total
:> 1: a 4934458058
:> 2: b 4901707746
由于某种原因,在j
子句中使用x类会导致data.table给出
正确答案:
dt[,.(total=sum(x),cls=class(x)),by=y]
:> y total cls
:> 1: a 4934458058 integer64
:> 2: b 4901707746 integer64
这很奇怪。是否有某种方法告诉data.table使用S3方法而不显式使用类?此特定问题是data.table版本1.9.4特有的,而不是data.table包的最新版本(截至本文撰写之时为1.9.6)。您可以通过以下方式检查data.table的版本:
installed.packages()['data.table','Version']
如果小于1.9.6
,则需要调用install.packages('data.table')
。请注意,如果您使用的是Revolution Analytics提供的R版本,则需要将repos
参数显式设置为,因为他们最新的repo(截至本文撰写之时)有数据。表1.9.4版:
install.packages('data.table',repos="http://my.favorite.CRAN.mirror/")
虽然我很少使用,但我将这些行放在我使用的机器的文件中:
if( packageVersion("data.table") == package_version('1.9.4'))
install.packages("data.table",lib=Sys.getenv("R_LIBS_USER"),repos='http://my.favorite.CRAN.mirror')
对于使用更新版本的data.table搜索此文件的任何其他人,请注意,在使用时,S3方法分派仍然不总是发生--显然,出于速度考虑,这是有意的。请参阅您的
数据是什么。表版本?在v1.9.6上使用sum(x)
可以很好地工作。看起来我在,我在data.table版本1.9.4上,这是RRO回购的最新版本(https://mran.revolutionanalytics.com/snapshot/2015-08-27
)指向。我从一个cran镜像更新,修复了问题…很高兴知道。请记住为此类问题发布您的sessionInfo()
。你最好自己回答这个问题并接受它,这样对其他可能遇到同样问题的用户有用。packageVersion(“data.table”)
是一个很好的工具,@RS。我不知道packageVersion
——这是一个比较软件包版本的好界面!这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-