web-dev-qa-db-fra.com

Comment lancez-vous un double sur un entier en R?

Ma question est la suivante: supposons que vous ayez calculé un algorithme donnant le nombre d'itérations et que vous souhaitiez en imprimer le nombre. Mais la sortie comporte toujours plusieurs décimales, comme suit:

64.00000000

Est-il possible d’obtenir un nombre entier en effectuant un transtypage dans R? Comment le ferais-tu ??

13
user1769197

Au lieu d'essayer de convertir la sortie en un entier, essayez de comprendre pourquoi ce n'est pas un entier et corrigez-le.

L’avez-vous initialisé sous forme d’entier, par exemple num.iterations <- 0L ou num.iterations <- integer(1) ou avez-vous commis l'erreur de le régler sur 0 (numérique)?

Lorsque vous l'avez incrémenté, avez-vous ajouté 1 (un chiffre) ou 1L (un entier)?

Si vous n'êtes pas sûr, parcourez votre code et vérifiez le type de votre variable à l'aide de la fonction class.

Si vous résolvez le problème à la racine, vous épargnerez beaucoup de problèmes. Cela pourrait également rendre votre code plus efficace, car de nombreuses opérations sont plus rapides sur les entiers que sur les numériques ( un exemple ).

8
flodel

Il y a quelques pièges à contourner en mode entier. Vraisemblablement, vous avez une variété de chiffres dans une structure. Si vous travaillez avec une matrice, la routine d'impression affichera tous les nombres avec la même précision. Si vous avez calculé ce résultat avec un processus arithmétique, il se peut que l'affichage corresponde à moins de 64 bits.

> 64.00000000-.00000099999
[1] 64
> 64.00000000-.0000099999
[1] 63.99999

En supposant que vous souhaitiez que toutes les valeurs de la structure faisant partie de celle-ci soient affichées sous forme d’entiers, le plus sûr serait:

round(64.000000, 0)

... puisque cela pourrait arriver, sinon. 

> as.integer(64.00000000-.00000000009)
[1] 63

L'autre chose à faire est que la plage de valeurs pour les entiers est considérablement inférieure à la plage de nombres en virgule flottante.

6
42-

La fonction as.integer() tronque le nombre jusqu’à 0, vous devez donc ajouter un 0.5 pour obtenir un

dd<-64.00000000
as.integer(dd+0.5)
4
emanuele

Si vous souhaitez contraindre une matrice numérique à une matrice entière (par exemple, vous créez un ensemble de variables nominales à partir d'un facteur), as.integer(matrix_object) contraindra la matrice à un vecteur, ce qui n'est pas ce que vous voulez. Au lieu de cela, vous pouvez utiliser storage.mode(matrix_object) <- "integer" pour conserver le formulaire matriciel.

0
kakarot