Estou escrevendo uma função para plotar dados. Gostaria de especificar um bom número redondo para o eixo y max
que seja maior que o máximo do conjunto de dados.
Especificamente, gostaria de uma função foo
que execute o seguinte:
foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110
Eu cheguei tão longe quanto
foo <- function(x) ceiling(max(x)/10)*10
para arredondamento para os 10 mais próximos, mas isso não funciona para intervalos de arredondamento arbitrários.
Existe uma maneira melhor de fazer isso no R?
?pretty
?foo(4)==5
e não é10
?Respostas:
Se você deseja arredondar para cima para a potência de 10 mais próxima, basta definir:
Na verdade, isso também funciona quando x é um vetor:
..mas se você quiser arredondar para um número "legal", primeiro você precisa definir o que é um número "legal". O seguinte nos permite definir "nice" como um vetor com bons valores de base de 1 a 10. O padrão é definido para os números pares mais 5.
O acima não funciona quando x é um vetor - tarde da noite agora :)
[[EDITAR]]
Se a questão for como arredondar para um valor mais próximo especificado (como 10 ou 100), a resposta de James parece mais apropriada. Minha versão permite que você pegue qualquer valor e o arredonde automaticamente para um valor razoavelmente "bom". Algumas outras boas escolhas do vetor "legal" acima são:
1:10, c(1,5,10), seq(1, 10, 0.1)
Se você tiver uma faixa de valores em seu gráfico, por exemplo
[3996.225, 40001.893]
, a forma automática deve levar em consideração o tamanho da faixa e a magnitude dos números. E, conforme observado por Hadley , apretty()
função pode ser o que você deseja.fonte
Vectorize(roundUpNice)
é bastante rápido =) +1 De qualquer forma.roundUpNice(501, nice=c(5, 10)) # 1000
x < 0
e aplico- x
no log antes de colocar as-
costas. Eu também adicionaria uma exceção para a situação em quex = 0
A
plyr
biblioteca tem uma funçãoround_any
bastante genérica para fazer todos os tipos de arredondamento. Por exemplofonte
dplyr
substituição, consulte: stackoverflow.com/a/46489816/435093A função de arredondamento em R atribui um significado especial ao parâmetro de dígitos se for negativo.
Isso significa que uma função como a seguinte chega muito perto do que você está pedindo.
O resultado é semelhante ao seguinte
fonte
E se:
Que dá:
fonte
pretty
é provavelmente a melhor opção.to * ceiling(x / to)
estaria mais limpo?Se você adicionar um número negativo ao argumento de dígitos de round (), R o arredondará para múltiplos de 10, 100 etc.
fonte
Arredonde QUALQUER número para cima / baixo para QUALQUER intervalo
Você pode facilmente arredondar os números para um intervalo específico usando o operador de módulo
%%
.A função:
Exemplos:
Como funciona:
O operador de módulo
%%
determina o resto da divisão do primeiro número pelo segundo. Adicionar ou subtrair este intervalo ao seu número de interesse pode essencialmente 'arredondar' o número para um intervalo de sua escolha.Atualizar:
A versão conveniente de 2 argumentos:
y
Valores positivosroundUp
, enquantoy
valores negativosroundDown
:Ou....
Função que arredonda automaticamente PARA CIMA ou PARA BAIXO base nas regras de arredondamento padrão:
Arredonda automaticamente se o
x
valor estiver na>
metade do caminho entre as instâncias subsequentes do valor de arredondamentoy
:fonte
Round
para VBA no Excel:Function ROUND(x,y) 'Function that automatically rounds UP or DOWN based on standard rounding rules. 'Automatically rounds up if the "x" value is > halfway between subsequent instances of the rounding value "y": If (y - (Evaluate("Mod(" & x & "," & y & ")"))) <= (Evaluate("Mod(" & x & "," & y & ")")) Then Ans = x + (y - (Evaluate("Mod(" & x & "," & y & ")"))) Else Ans = x - (Evaluate("Mod(" & x & "," & y & ")")) End If ROUND = Ans End Function
A respeito de arredondamento para a multiplicidade de um número arbitrário , por exemplo, 10, aqui está uma alternativa simples para a resposta de James.
Funciona para qualquer número real arredondado para cima (
from
) e qualquer número real positivo arredondado para (to
):Exemplo:
fonte
Acho que seu código funciona bem com uma pequena modificação:
E seus exemplos são:
Alterei sua função de duas maneiras:
=1e-09
sinta-se à vontade para modificar!) aomax(x)
se você quiser um número maiorfonte
Se você sempre quer arredondar um número até ao X mais próximo, você pode usar a
ceiling
função:Da mesma forma, se você quiser sempre arredondar para baixo , use a
floor
função. Se você quiser simplesmente arredondar para cima ou para baixo até o Z mais próximo, useround
.fonte
Você encontrará uma versão atualizada da resposta de Tommy que leva em consideração vários casos:
Abaixo do código:
fonte
> round.up.nice(.01) [1] 0 > round.up.nice(4.5) [1] 0 > round.up.nice(56) [1] 50
nice_big
enice_small
são definidos ao contrário (se os invertermos na função,round.up.nice(4.5)
tornam-se4
), mas ainda assim arredondam para baixo.Tentei fazer isso sem usar nenhuma biblioteca externa ou recursos criptográficos e funcionou!
Espero que ajude alguém.
fonte