2015-12-03 2 views
3

Немного странного случая: у меня есть код, который создает матрицы 2x2 и заполняет их конкретными значениями, а затем генерирует другие матрицы с длиной, равной значениям ячейки в первых матрицах. Когда я смотрю на значения в матрице, я получаю один результат - и когда я иду создавать списки, они действуют как совершенно другое число.R: Значения, зависящие от метода вызова

Например, соответствующий код, работающий на 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, и это не уникально (по некоторым причинам я вижу это на других версиях одной и той же проблемы). Однако это также не универсально: некоторые другие таблицы, созданные таким образом, работают точно так, как ожидалось.

Что происходит, и как я могу это исправить?

ответ

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 по этой теме, которая имеет отличный ответ.

+0

Большое спасибо; ваш ответ объяснял не только то, что было не так, но почему я его не замечал, и ответ, который вы связывали, имеет смысл (... в ретроспективе). –

+0

Добро пожаловать. Если бы ответ помог, пожалуйста, согласитесь, принимая его. – Stibu

Смежные вопросы