R - 从列表中的列上获取矩阵多重复制的不正确结果

时间:2018-05-31 14:08:55

标签: r

我正在处理我正在进行矩阵计算的列表数据数据,并且我得到了一些奇怪的行为。

当我从列表中提取数据并应用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 :(得分:2)

这是因为数据框中的实际值是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