R: Округление, только если есть более двух десятичных знаков - PullRequest
0 голосов
/ 07 июня 2019

Я хочу округлить набор значений до ближайшего целого числа, но только если число имеет два или более десятичных знака. В противном случае я хочу оставить номер без изменений.

Это можно сделать, используя gsubfn, регулярное выражение и преобразования нескольких типов, но есть ли более элегантный способ сделать это?

library(gsubfn)

y <- c(210.61233,212.41, 213.2, 214)

y <- as.character(y)
as.numeric(gsubfn("(\\d+\\.\\d{2,})", ~ round(as.numeric(x), 0) ,  y))
#211.0 212.0 213.2 214.0

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

Возможны следующие варианты:

y <- c(210.61233,212.41, 213.2, 214)

ifelse(y == round(y, 1), y, round(y))
[1] 211.0 212.0 213.2 214.0

Сначала вы проверяете, изменяется ли число, если оно округлено до одной цифры.Если нет, оставьте его, иначе округлите до ближайшего целого числа.

2 голосов
/ 07 июня 2019

Это, возможно, слишком сложно, но можно написать простую функцию следующим образом:

y <- c(210.61233,212.41, 213.2, 214)


round_if<-function(my_vec,min_length){

my_pattern<-paste0("\\.(?=\\d{",min_length,",})")

to_replace<-grep(my_pattern,my_vec,perl=TRUE)

    my_vec[to_replace] <- round(Filter(function(x)grep(my_pattern,
                                   x,perl = TRUE),my_vec),0)
    my_vec

  }

Тестирование на вышеуказанном:

  round_if(y,2)
#[1] 211.0 212.0 213.2 214.0
...