有点奇怪的情况:我有代码创建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值,这并不是唯一的(我出于某种原因在同一问题的其他版本上看到它)。但是,它也不是通用的:以这种方式生成的其他一些表完全按预期工作。
发生了什么,我该如何解决?
答案 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有一个很好的答案。