R:取决于呼叫方法而变化的值

时间:2015-12-03 20:09:50

标签: r matrix

有点奇怪的情况:我有代码创建2x2矩阵并用特定值填充它们,然后生成长度等于第一个矩阵中单元格值的其他矩阵。当我查看矩阵中的值时,我得到一个结果 - 当我去生成列表时,它们就像一个完全不同的数字。

例如,相关代码,运行于R 3.2.2

N <-100 
pa <-.3
pna <- .4
pb <-.1
pnb <-.2

table.nH <- matrix(nrow=2,ncol=2)

table.nH[1,1] <- (1-pna)*(1-pnb)*N

table.nH[2,1] <- (1-pa)*(1-pnb)*N

table.nH[1,1] #This should be 48

> [1] 48

table.nH[2,1] #This should be 56

> [1] 56

pass.list <- matrix(rep(c(0,0,0,0),table.nH[1,1]),ncol=4,byrow=TRUE)

fail.list <- matrix(rep(c(0,0,0,0),table.nH[2,1]),ncol=4,byrow=TRUE)

length(pass.list[,1]) #Number of rows *should be* 48

> [1] 48

length(fail.list[,1]) #Number of rows *should be* 56

> [1] 55

我不能为我的生活弄清楚为什么一个有效但另一个无效。它可以工作,如果我硬编码56(即rep(c(0,0,0,0),56))但不是如果我引用矩阵中的56。有问题的实际表没有NA值,这并不是唯一的(我出于某种原因在同一问题的其他版本上看到它)。但是,它也不是通用的:以这种方式生成的其他一些表完全按预期工作。

发生了什么,我该如何解决?

1 个答案:

答案 0 :(得分:3)

原因在于rep的行为。在文档中,它说

  

非整数倍的时间将被截断为零。

现在,如果你仔细查看矩阵中的值,你会注意到,其中一个值不是整数:

format(table.nH, digits = 18)
#      [,1]                  [,2]                 
# [1,] "48.0000000000000000" "                 NA"
# [2,] "55.9999999999999929" "                 NA"

如果table.nH[2, 1]四舍五入为零,则会得到55。

您可以通过舍入为整数

来解决此问题
table.nH <- round(table.nH, 0)
format(table.nH, digits = 18)
#      [,1] [,2]
# [1,] "48" "NA"
# [2,] "56" "NA"

如果您想知道为什么table.nH[2, 1]不是整数:这与浮点数的表示方式有关。关于此主题的There is a question有一个很好的答案。