R - Получение неправильных результатов для матричной мультипликации столбца из списка - PullRequest
0 голосов
/ 31 мая 2018

Я обрабатываю данные списка данных, на которых я выполняю матричные вычисления, и у меня странное поведение.

Когда я извлекаю данные из списка и применяю функцию tcrossprod, я получаю ответы, отличные от тех, которые я получаюожидать.Ниже приведен упрощенный пример проблемы.

Мои данные имеют такую ​​форму ...

> test_list <- list(data.frame("col1" = c('a','b'), "col2" = c(229187.82,135323.01)))

> test_list
[[1]]
  col1   col2
1    a 229188
2    b 135323

Применение tcrossprod дает неверный результат для данных ...

> tcrossprod(test_list[[1]]$col2)
            [,1]        [,2]
[1,] 52527056836 31014385658
[2,] 31014385658 18312317035

Это правильный ответ ...

> vec <- c(229188,135323)

> vec
[1] 229188 135323

> tcrossprod(vec)
            [,1]        [,2]
[1,] 52527139344 31014407724
[2,] 31014407724 18312314329

А вот разница между двумя вычислениями ...

> tcrossprod(vec) - tcrossprod(test_list[[1]]$col2)
        [,1]     [,2]
[1,] 82507.6 22066.26
[2,] 22066.3 -2706.46

Я не могу найти причину, почемусуществует несоответствие между двумя расчетами ...

> typeof(test_list[[1]]$col2)
[1] "double"
> typeof(vec)
[1] "double"

> class(test_list[[1]]$col2)
[1] "numeric"
> class(vec)
[1] "numeric"

Есть ли способ исправить эту проблему, чтобы вычисленные числа были правильными?

1 Ответ

0 голосов
/ 31 мая 2018

Это потому, что реальное значение в вашем фрейме данных - c (229187,82,135323.01).Затем, когда вы отображаете, они округляют его до: c (229188,135323)

В вашем примере вы затем используете округленные числа, которые не являются правильными.

> test_list <- list(data.frame("col1" = c('a','b'), "col2" = c(229187.82,135323.01)))
> a<-test_list[[1]]$col2
> vec1 <- matrix(c(229187.82,135323.01),nrow=2)
> tcrossprod(vec1)
            [,1]        [,2]
[1,] 52527056836 31014385658
[2,] 31014385658 18312317035
> vec2=matrix(a,nrow=2)
> tcrossprod(vec2)
            [,1]        [,2]
[1,] 52527056836 31014385658
[2,] 31014385658 18312317035
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...