Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用`by`子句时在data.table中分派S3方法_R_Data.table - Fatal编程技术网

R 使用`by`子句时在data.table中分派S3方法

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

更新:这似乎是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
:>  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
——这是一个比较软件包版本的好界面!这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-