Tour de .5
Oui, je sais pourquoi nous avons toujours arrondir au plus proche nombre pair si nous sommes dans le milieu exact (c'est à dire 2.5 devient 2) de deux nombres. Mais quand je veux évaluer des données pour certaines personnes, ils ne veulent pas de ce comportement. Quelle est la méthode la plus simple pour obtenir ceci:
x <- seq(0.5,9.5,by=1)
round(x)
à 1,2,3,...,10 et pas 0,2,2,4,4,...,10.
Edit: Pour clearify: 1.4999 devrait être de 1 après l'arrondissement. (Je pensais que ce serait évident)
- Suis-je en droit de penser que vous voulez des valeurs <= 0,4 à tour à 0 et les valeurs >= 0,5 à arrondir à 1?
- sont-ils vraiment? Pouvez-vous développer? Que
round
cartesn + .5
àn
semble arbitraire pour moi. - Il est facile de simuler. Basé sur la séquence
x
à partir de ci-dessus essayezmean(x); mean(round(x)); mean(floor(0.5 + x))
. Bien sûr, ce n'est pas une preuve tout ce que ce ne pouvait être qu'un cas particulier. Mais regardez cela de cette façon: Si nous autour de chaque x.5 bien sûr, nos données arrondies qu'est biaisée. Si nous arrondissons à chaque seconde.x.5 nous contrecarrer cet effet. C'est pourquoi nous avons tour à l'autre, même numéro. - Comapre
sum(seq(0.5,1e3,by=0.5))
avec les sommes de chacune des arrondis versions des séquences - Pour ne pas mentionner que "l'arrondi à la même chiffres" est l'IEC 60559 standard comme mentionné dans
?round
.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas ma propre fonction, et malheureusement,
je ne trouve pas où je l'ai eu à l'instant(à l'origine comme un anonyme commentaire sur la Statistiquement Significative blog), mais il devrait aider avec ce que vous avez besoin.x
est l'objet que vous voulez arrondir, etn
est le nombre de chiffres que l'on arrondi pour.Un Exemple
n=0
dans votre exemple, même le définir comme valeur par défaut dans votre fonction. Notez également qu'il gère les nombres négatifs différemment:round2(-0.5, 0)
donne-1
alors que ma méthode sera de retour0
.x
loin de zéro avecn
chiffres:round2 = function(x, n=0) {scale<-10^n; sign(x)*trunc(abs(x)*scale+0.5)/scale}
. Il y a certainement un natif/fonction intégrée dans R?round2 = function(x, n=0) {scale<-10^n; trunc(x*scale+sign(x)*0.5)/scale}
round2 <- function(x, n) (trunc((abs(x) * 10 ^ n) + 0.5) / 10 ^ n) * sign(x)
Si vous voulez quelque chose qui se comporte exactement comme
round
à l'exception de ceux xxx.5 valeurs, essayez ceci:floor(0.2850*100+0.5)
retour 28, alors quefloor(0.3850*100+0.5)
retourne 39, etfloor(0.4850*100+0.5)
retourne 49Cela semble fonctionner:
Ananda Mahto la réponse semble faire cela et même plus, je ne suis pas sûr de ce que le code supplémentaire dans sa réponse, comptabilité; ou, en d'autres termes, je ne peux pas comprendre comment sortir de la fonction rnd() définie ci-dessus.
Exemple:
rdn
fonction que vous avez posté ne prend qu'un seul argument (le vecteur d'entrée), mais de vous montrer qu'il est utilisé avec deux arguments. La fonction que j'ai posté essaie à l'adresse de l'arrondissement à l'autre endroit valeurs. Par exemple, comparer la différence entreround(x, 2)
etround2(x, 2)
quandx = c(1.855, 1.545, 1.655, 1.855, 1.845)
.x <- seq(-5, 5, by=0.5)
et puistrunc(x+sign(x)*0.5)
. Élégant!Comme @CarlWitthoft dit dans les commentaires, c'est l'IEC 60559 standard comme mentionné dans
?round
:Un explication complémentaire par Greg Neige:
Selon la façon dont vous êtes à l'aise avec branlement de vos données, cela fonctionne: