示例数据.
require(data.table)
dt <- data.table(rnorm(10), rnorm(10) < 0.5)
Run Code Online (Sandbox Code Playgroud)
数值和逻辑变量之间的计算相关性会产生错误.
cor(dt)
#Error in cor(dt) : 'x' must be numeric
Run Code Online (Sandbox Code Playgroud)
但转换为数据帧时错误消失了.
cor(data.frame(dt))
# V1 V2
#V1 1.0000000 -0.1631356
#V2 -0.1631356 1.0000000
Run Code Online (Sandbox Code Playgroud)
这是预期的行为data.table吗?
cor测试是否x或y(参数)是data.frames(使用is.data.frame- 哪个data.table也将返回TRUE)然后将参数强制转换为矩阵
if (is.data.frame(x)) x <- as.matrix(x)
Run Code Online (Sandbox Code Playgroud)
问题似乎是不同的方式,as.matrix.data.table并as.matrix.data.frame与示例矩阵一起使用
as.matrix(dt)
Run Code Online (Sandbox Code Playgroud)
返回一个字符矩阵 - 这似乎是一个错误 data.table
as.matrix.data.table并且as.matrix.data.frame似乎共享类似的代码以进行不同的调度
# data.table:::as.matrix.data.table
else if (non.numeric) {
for (j in seq_len(p)) {
if (is.character(X[[j]]))
next
xj <- X[[j]]
miss <- is.na(xj)
xj <- if (length(levels(xj)))
as.vector(xj)
else format(xj)
is.na(xj) <- miss
X[[j]] <- xj
}
}
## base::as.matrix.data.frame
else if (non.numeric) {
for (j in pseq) {
if (is.character(X[[j]]))
next
xj <- X[[j]]
miss <- is.na(xj)
xj <- if (length(levels(xj)))
as.vector(xj)
else format(xj)
is.na(xj) <- miss
X[[j]] <- xj
}
}
Run Code Online (Sandbox Code Playgroud)
目前,该data.table版本将逻辑列强制转换为字符.