13

Now, there has been some very similar questions on SO about rounding and significance, but non solves my issue. Here it is:

How to round randomly occurring numbers like these:

data <- c(152.335, 39.431, 21.894)

I would like to have them rounded like this:

c(150,40,20)

I have tried:

print(formatC(signif(data,digits=2), digits=2,format="f"))

Output:

[1] "150.00" "39.00"  "22.00"

The above command requires me to change the digits= to 1 or 2 in order to obtain the desired outcome. But, I would like a global - fit for all command. Thanks.

Maximilian
  • 4,177
  • 7
  • 46
  • 85
  • SO 21.8 turns 20? this doesnt make sense. – Fernando Aug 28 '13 at 16:01
  • Duplicate? http://stackoverflow.com/questions/6461209/how-to-round-up-to-the-nearest-10-or-100-or-x – Henrik Aug 28 '13 at 16:04
  • @Fernando, it seems like Max wishes to round to nearest 10. – Henrik Aug 28 '13 at 16:05
  • @Henrik: Yes thanks. This is it. Actually the plyr package does what I need. Thats: round_any(data, 5) – Maximilian Aug 28 '13 at 16:08
  • 2
    @Max, may I suggest that you make your title more specific, in the sense that you wish to round to nearest 10, and more general in the sense that your question probably applies also to numbers other than random numbers. This makes it easier for other to find answers when they search on SO. – Henrik Aug 28 '13 at 16:14
  • or this one: https://stackoverflow.com/questions/8664976/r-round-to-nearest-5-or-1 – Brian D Feb 15 '18 at 15:56

2 Answers2

29

From ?round

Rounding to a negative number of digits means rounding to a power of ten, so for example ‘round(x, digits = -2)’ rounds to the nearest hundred.

So,

data <- c(152.335, 39.431, 21.894)
round(data, -1)
#[1] 150  40  20
GSee
  • 48,880
  • 13
  • 125
  • 145
3

You actually want a different argument for signif here. This seems to do the trick -- 2 digits for first argument, one for the last two:

R> dat <- c(152.335, 39.431, 21.894)
R> dat
[1] 152.335  39.431  21.894
R> signif(dat, digits=c(2,1,1))
[1] 150  40  20
R> 

You can possibly generalize this via something like

R> signif(dat, digits=floor(log10(dat)))
[1] 150  40  20
R> 
Dirk Eddelbuettel
  • 360,940
  • 56
  • 644
  • 725
  • Thanks. Actually just found out (as Henrik pointed out), the plyr package command: round_any(data, 5) ,does what I need. But your solution is from R basic and hence no package required! – Maximilian Aug 28 '13 at 16:11