comment retourner le nombre de décimales en R
Je travaille dans R. j'ai une série de coordonnées en degrés décimaux, et je voudrais trier ces coordonnées par le nombre de décimales que ces chiffres ont (c'est à dire je veux jeter coordonnées qui ont trop peu de décimales).
Est-il une fonction dans R qui peut ramener le nombre de décimales d'un nombre a, que je serais capable d'intégrer dans la fonction de l'écriture?
Exemple d'entrée:
AniSom4 -17.23300000 -65.81700
AniSom5 -18.15000000 -63.86700
AniSom6 1.42444444 -75.86972
AniSom7 2.41700000 -76.81700
AniLac9 8.6000000 -71.15000
AniLac5 -0.4000000 -78.00000
J'ai l'idéal serait d'écrire un script qui serait jeter AniLac9 et AniLac 5 parce que ces coordonnées n'ont pas été enregistrées avec suffisamment de précision. Je voudrais jeter coordonnées pour laquelle tant de la longitude et de la latitude ont moins de 3 non-zéro des valeurs décimales.
source d'informationauteur Pascal
Vous devez vous connecter pour publier un commentaire.
Vous pourriez écrire une petite fonction pour la tâche avec facilité, par exemple:
Et de l'exécution:
Mise à jour (3 Avr., 2018) à l'adresse @owen88 rapport sur l'erreur due à l'arrondissement de double précision des nombres à virgule flottante-remplacer le
x %% 1
vérifier:Rollowing sur Romain suggestion:
Si vos données n'est pas garanti d'être de la bonne forme, vous devriez faire plus de vérifier que les autres personnages ne sont pas se faufiler dans.
Ici en est une. Il vérifie les 20 premières décimales après la virgule, mais vous pouvez ajuster le nombre de 20 si vous avez autre chose à l'esprit.
Voici une autre manière.
En [R] il n'y a pas de différence entre 2.30000 et 2.3, les deux arrondir à 2,3 donc l'un n'est pas plus précise que les autres si c'est ce que vous voulez vérifier. D'autre part, si ce n'est pas ce que tu voulais dire: Si vous voulez vraiment faire cela, vous pouvez utiliser 1) multiplier par 10, 2) utiliser la fonction floor() 3) diviser par 10 4) vérifier l'égalité avec l'original. (Toutefois être conscient que la comparaison des flotteurs pour l'égalité est une mauvaise pratique, assurez-vous que c'est vraiment ce que vous voulez)
Pour l'application commune, voici la modification de daroczig code pour manipuler des vecteurs:
En général, il peut y avoir des problèmes avec la façon dont un nombre à virgule flottante sont stockées sous forme binaire. Essayez ceci:
Combien de décimales faisons-nous maintenant?
Ne veux pas détourner le fil, il suffit de poster ici car cela pourrait aider quelqu'un à faire face à la tâche, j'ai essayé de le faire avec le projet de code.
Malheureusement, même la mise à jour @daroczig la solution n'a pas fonctionné pour moi pour vérifier si un nombre est inférieur à 8 chiffres après la virgule.
@daroczig code:
Dans mon cas, a donné les résultats suivants
etc.
Jusqu'à présent était en mesure d'effectuer les tests requis par la suivante maladroit code:
PS: j'ai peut-être raté quelque chose en ce qui concerne de ne pas prendre la racine de la
.Machine$double.eps
veuillez donc prendre des précautionsQuestion intéressante. Voici un autre tweak sur le dessus de répondants travail, vectorisé, et étendu à manipuler les chiffres à gauche du point décimal. Testé contre les chiffres négatifs, ce qui donnerait un résultat incorrect pour la précédente
strsplit()
approche.Si c'est voulu de ne compter que sur le droit, la
trailingonly
argument peut être mis àTRUE
.Ici est la
strsplit()
version.La chaîne de version coupe à 15 chiffres (en fait, je ne sais pas pourquoi l'autre endroits argument est désactivée par un... la raison pour laquelle il est dépassé par est qu'il compte le nombre de chiffres dans les deux directions, de sorte qu'il pourrait aller jusqu'à deux fois la taille si le nombre est suffisamment grand). Il y a probablement une option de mise en forme à
as.character()
qui peut donnernd2()
une option équivalente à laplaces
argument dend1()
.nd1()
est plus rapide.Une autre contribution, en gardant entièrement numérique des représentations sans avoir à les convertir caractère: