【问题标题】:data.table incorrect behaviour on PowerPC and SPARC (both big-endian)PowerPC 和 SPARC(均为大端)上的 data.table 行为不正确
【发布时间】:2014-05-22 11:45:09
【问题描述】:

有一个data.table dt,我用cut做了一些分类:

require(data.table)
set.seed(1)
dt <- data.table(x = rnorm(10))
dt[, y := cut(x, breaks = c(-Inf, 0, Inf), labels = 1:2)]

如果我将结果因子 y 转换为数值(使用基于 ?factor 的函数 as.Numeric),则二进制搜索不再起作用,尽管 z 是数值。

as.Numeric <- function(f){
  as.numeric(levels(f))[f]
}

dt[, z := as.Numeric(y)] # as.numeric(as.character(y))
                                    # is working ...
dt
##              x y z
##  1: -0.6264538 1 1
##  2:  0.1836433 2 2
##  3: -0.8356286 1 1
##  4:  1.5952808 2 2
##  5:  0.3295078 2 2
##  6: -0.8204684 1 1
##  7:  0.4874291 2 2
##  8:  0.7383247 2 2
##  9:  0.5757814 2 2
## 10: -0.3053884 1 1

setkey(dt, z)
dt
##              x y z
##  1:  0.1836433 2 2
##  2:  1.5952808 2 2
##  3:  0.3295078 2 2
##  4:  0.4874291 2 2
##  5:  0.7383247 2 2
##  6:  0.5757814 2 2
##  7: -0.6264538 1 1
##  8: -0.8356286 1 1
##  9: -0.8204684 1 1
## 10: -0.3053884 1 1

dt[J(1)] # doesn't work
##     x  y z
## 1: NA NA 1

dt[y == 1, ] # works fine
##             x y z
## 1: -0.6264538 1 1
## 2: -0.8356286 1 1
## 3: -0.8204684 1 1
## 4: -0.3053884 1 1

str(dt)
## Classes ‘data.table’ and 'data.frame':   10 obs. of  3 variables:
##  $ x: num  0.184 1.595 0.33 0.487 0.738 ...
##  $ y: Factor w/ 2 levels "1","2": 2 2 2 2 2 2 1 1 1 1
##  $ z: num  2 2 2 2 2 2 1 1 1 1
##  - attr(*, ".internal.selfref")=<externalptr> 
##  - attr(*, "sorted")= chr "z"

尝试再次设置密钥,没有帮助:

setkey(dt, z)
## Warning message:
## In setkeyv(x, cols, verbose = verbose) :
##   Already keyed by this key but had invalid row order, key rebuilt. If you didn't go under the hood please let datatable-help know so the root cause can be fixed.

dt
##              x y z
##  1:  0.1836433 2 2
##  2:  1.5952808 2 2
##  3:  0.3295078 2 2
##  4:  0.4874291 2 2
##  5:  0.7383247 2 2
##  6:  0.5757814 2 2
##  7: -0.6264538 1 1
##  8: -0.8356286 1 1
##  9: -0.8204684 1 1
## 10: -0.3053884 1 1

dt[J(1)] # doesn't work
##     x  y z
## 1: NA NA 1

矢量扫描正在工作,因为不需要密钥。使用as.numeric(as.character(y)) 也有效。也许as.Numeric 中的[ 运算符有问题?使用与 dt 1.8.10 相同的代码,一切都像预期的那样。很难找到,为什么代码在 1.9.3 中不再工作...

问题:

这是一个错误吗?

附言:

sessionInfo()
## R version 3.1.0 (2014-04-10)
## Platform: powerpc64-unknown-linux-gnu (64-bit)

## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] 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   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

## attached base packages:
## [1] splines   grid      stats     graphics  grDevices utils     datasets 
## [8] methods   base     

## other attached packages:
##  [1] plyr_1.8.1        reshape2_1.4      lubridate_1.3.3   HP14int_0.1-15   
##  [5] Hmisc_3.14-4      Formula_1.1-1     survival_2.37-7   lattice_0.20-29  
##  [9] HP14unidata_1.1-1 data.table_1.9.3 

## loaded via a namespace (and not attached):
## [1] cluster_1.15.2      digest_0.6.4        latticeExtra_0.6-26
## [4] memoise_0.2.1       RColorBrewer_1.0-5  Rcpp_0.11.1        
## [7] stringr_0.6.2       tools_3.1.0

writeLines(paste("Endianess:", .Platform$endian))
## Endianess: big

【问题讨论】:

  • 谢谢,但我无法重现它。在 R v3.0.3 和 v3.1.0、OS X Mountain Lion 上使用 1.9.3 进行了测试,并且工作正常。我看到z 是从您的str 输出中按降序排列的。所以很清楚为什么它不起作用(续)...
  • 我想问你几件事。 1) 您能否粘贴运行test.data.table() 的错误编号(如果有)? 1.9.2 + R v3.1.01.9.3 + R v3.0.3 会发生什么? 3) 另外,你可以在运行setkey(dt, z)(包括警告信息,如果有的话)两次之后粘贴dt 吗?谢谢。
  • 是的,它的顺序错误。我现在在原帖中在setkey(dt, z) 之后添加了dt

标签: r data.table


【解决方案1】:

现在在v1.9.5 on GitHub 中修复。感谢您的报告。

恢复了与大端机器(例如 SPARC 和 PowerPC)的兼容性。大多数 Windows、Linux 和 Mac 系统都是小端的;输入.Platform$endian 进行确认。感谢 Gerhard Nachtmann 的报告和他们的 PowerPC 模拟器的 QEMU project

【讨论】:

猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多