我正在处理我正在执行矩阵计算的列表数据数据,并且我遇到了一些奇怪的行为。
当我从列表中提取数据并应用 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"
有没有办法解决此问题,以便计算的数字正确?
这是因为数据帧中的实际值是 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