数字和逻辑变量之间的相关性给出(预期)错误?

时间:2015-03-16 01:27:43

标签: r data.table

示例数据。

require(data.table)
dt <- data.table(rnorm(10), rnorm(10) < 0.5)

数值和逻辑变量之间的计算相关性会产生错误。

cor(dt)
#Error in cor(dt) : 'x' must be numeric

但转换为数据框时错误会消失。

cor(data.frame(dt))
#           V1         V2
#V1  1.0000000 -0.1631356
#V2 -0.1631356  1.0000000

这是data.table的预期行为吗?

2 个答案:

答案 0 :(得分:6)

cor测试xy(参数)是data.frames(使用is.data.frame - 哪些data.table也将返回TRUE)然后将参数强制转换为矩阵

if (is.data.frame(x)) x <- as.matrix(x)

问题似乎是as.matrix.data.tableas.matrix.data.frame处理示例矩阵的不同方式

as.matrix(dt)

返回一个字符矩阵 - 这似乎是data.table

中的错误

as.matrix.data.tableas.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
    }
}

目前,data.table版本将逻辑列强制转换为字符。

答案 1 :(得分:2)

此错误#1083现已在级别v1.9.5中使用提交#1797修复。

require(data.table)
set.seed(45L)
dt <- data.table(rnorm(10), rnorm(10) < 0.5)
#             V1    V2
#  1:  0.3407997  TRUE
#  2: -0.7033403  TRUE
#  3: -0.3795377 FALSE
#  4: -0.7460474 FALSE
#  5: -0.8981073  TRUE
#  6: -0.3347941  TRUE
#  7: -0.5013782  TRUE
#  8: -0.1745357  TRUE
#  9:  1.8090374 FALSE
# 10: -0.2301050  TRUE
as.matrix(dt)
#               V1 V2
#  [1,]  0.3407997  1
#  [2,] -0.7033403  1
#  [3,] -0.3795377  0
#  [4,] -0.7460474  0
#  [5,] -0.8981073  1
#  [6,] -0.3347941  1
#  [7,] -0.5013782  1
#  [8,] -0.1745357  1
#  [9,]  1.8090374  0
# [10,] -0.2301050  1