【发布时间】: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.0和1.9.3 + R v3.0.3会发生什么? 3) 另外,你可以在运行setkey(dt, z)(包括警告信息,如果有的话)两次之后粘贴dt吗?谢谢。 -
是的,它的顺序错误。我现在在原帖中在
setkey(dt, z)之后添加了dt。
标签: r data.table