gpt4 book ai didi

r - 使用 `by` 子句时在 data.table 中调度 S3 方法

转载 作者:行者123 更新时间:2023-12-04 19:53:19 24 4
gpt4 key购买 nike

更新:看来这是 data.table 版本 1.9.4 的问题,而不是软件包的最新版本(撰写本文时为 1.9.6)。

我有一张 table ,我通过 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参数到 your favorite CRAN mirror明确地作为他们最新的 repo(在撰写本文时)具有 data.table 版本 1.9.4:
install.packages('data.table',repos="http://my.favorite.CRAN.mirror/")

虽然我 很少使用 .Rprofile.site ,我把这些行放在我使用的机器上的那个文件中:
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')

关于r - 使用 `by` 子句时在 data.table 中调度 S3 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com