Question Arrondi de .5


Oui, je sais pourquoi nous arrondissons toujours au nombre pair le plus proche si nous sommes au centre exact (c.-à-d. 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)

être 1,2,3, ..., 10 et non 0,2,2,4,4, ..., 10.

Edit: Pour clearify: 1.4999 devrait être 1 après l'arrondissement. (Je pensais que ce serait évident)


44
2017-10-02 10:33


origine


Réponses:


Ce n'est pas ma propre fonction, et malheureusement, Je ne trouve pas où je l'ai eu pour le moment (à l'origine trouvé comme un commentaire anonyme à la Statistiquement significatif Blog), mais cela devrait vous aider avec ce dont vous avez besoin.

round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5
  z = trunc(z)
  z = z/10^n
  z*posneg
}

x est l'objet que vous voulez arrondir et n est le nombre de chiffres que vous arrondissez à.

Un exemple

x = c(1.85, 1.54, 1.65, 1.85, 1.84)
round(x, 1)
# [1] 1.8 1.5 1.6 1.8 1.8
round2(x, 1)
# [1] 1.9 1.5 1.7 1.9 1.8

45
2017-10-02 10:43



Si vous voulez quelque chose qui se comporte exactement comme round sauf pour les valeurs xxx.5, essayez ceci:

x <- seq(0, 1, 0.1)
x
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
floor(0.5 + x)
# [1] 0 0 0 0 0 1 1 1 1 1 1

29
2017-10-02 10:55



Cela semble fonctionner:

rnd <- function(x) trunc(x+sign(x)*0.5)

La réponse d'Ananda Mahto semble faire cela et plus encore - je ne suis pas sûr de ce que représente le code supplémentaire dans sa réponse; ou, en d'autres termes, je ne peux pas comprendre comment casser la fonction rnd () définie ci-dessus.

Exemple:

seq(-2, 2, by=0.5)
#  [1] -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0
round(x)
#  [1] -2 -2 -1  0  0  0  1  2  2
rnd(x)
#  [1] -2 -2 -1 -1  0  1  1  2  2

4
2017-09-23 18:02



Comme le disait @CarlWitthoft dans les commentaires, il s’agit de la norme IEC 60559 mentionnée dans ?round:

Notez que pour arrondir un 5, la norme CEI 60559 devrait être utilisée, "aller au chiffre pair". Le tour (0.5) est donc 0 et le tour (-1.5) est -2. Cependant, cela dépend des services du système d'exploitation et de l'erreur de représentation (puisque 0,15 n'est pas représenté exactement, la règle d'arrondi s'applique au nombre représenté et non au nombre imprimé, et donc arrondi (0,15, 1) pourrait être 0,1 ou 0,2 ).

Un explication supplémentaire par Greg Snow:

La logique derrière la règle du même à est que nous essayons de   représentent une valeur continue sous-jacente et si x provient d'un véritable   la distribution continue, alors la probabilité que x == 2.5 est 0 et le   2.5 était probablement déjà arrondi une fois parmi toutes les valeurs comprises entre 2,45 et 2,54999999999999 ..., si on utilise l’arrondi sur la règle de 0,5 que nous avons appris à l’école primaire, alors le double arrondi signifie que les valeurs   entre 2,45 et 2,50 seront tous à 3 (après avoir été arrondis en premier   à 2.5). Cela aura tendance à biaiser les estimations à la hausse. Pour supprimer le   biais, il faut soit revenir à l’arrondi à 2,5 (ce qui est   souvent impossible à mettre en pratique), ou juste arrondir la moitié du temps et   arrondir à la moitié du temps (ou mieux, arrondir proportionnellement à   dans quelle mesure nous voyons des valeurs inférieures ou supérieures à 2,5 arrondies à 2,5, mais   ce sera près de 50/50 pour la plupart des distributions sous-jacentes). le   approche stochastique serait d'avoir la fonction ronde au hasard   choisir comment arrondir, mais les types déterministes ne sont pas   convenable avec ça, alors "round to even" a été choisi (rond à étrange   devrait fonctionner à peu près le même) comme une règle cohérente qui arrondit et   vers le bas environ 50/50.

Si vous traitez des données où 2.5 est susceptible de représenter un   valeur (argent par exemple), alors vous pouvez faire mieux en multipliant tout   valeurs par 10 ou 100 et travail en nombres entiers, puis reconversion uniquement   pour l'impression finale. Notez que 2.50000001 arrondit à 3, donc si vous   garder plus de chiffres de précision jusqu'à l'impression finale, puis arrondir   ira dans la direction prévue, ou vous pouvez ajouter 0.000000001 (ou   autre petit nombre) à vos valeurs juste avant l’arrondi, mais cela peut   biaiser vos estimations à la hausse.


4
2017-12-29 20:22



Selon votre niveau de confort avec vos données, cela fonctionne:

round(x+10*.Machine$double.eps)
# [1]  1  2  3  4  5  6  7  8  9 10

2