2015-03-16 2 views
4

Примеры данных.Корреляция между числовой и логической переменной дает (предназначенную) ошибку?

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? x или y (аргументы) являются

ответ

6

cor проверяет, является ли data.frames (с использованием is.data.frame - который data.table возвратит TRUE, а), а затем принуждают аргумент в матрицу

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

Проблема, как представляется, различные способы as.matrix.data.table и as.matrix.data.frame работа с матрицей, например

as.matrix(dt) 

возвращает матрицу символов - это будет appea г быть ошибка в 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 
    } 
} 

В настоящее время версия data.table принуждают логический столбец символа.

+0

Вы правы, вот что происходит. Преобразование столбцов 'dt' в матрицу по отдельности (например,' as.matrix (dt [, 2, with = FALSE]) 'действительно дает правильное преобразование в исходный класс переменных. Предлагает, что это действительно ошибка, для которой я подал заявку отчет об ошибке. –

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 
Смежные вопросы