Страница 1 из 1

Округлить число и разбить на разряды

Добавлено: 17 июл 2020, 12:01
VistaSV30
Добрый день!
Подскажите как из вектора n <- c(1001:1003, 1004.3)
Получить: 1'001, 1'002, 1'003, 1'004.3

Код: Выделить всё

n <- c(1001:1003, 1004.3)

n <- round(n, digits = 1)
format(n, big.mark = "'")
Пока получаю: "1'001" "1'002" "1'003" "1'004" или "1'001.0" "1'002.0" "1'003.0" "1'004.3"
У всех чисел одинаковое количество знаков после запятой, а нужно, чтоб нулей после запятой не было.

Пока делаю так:

Код: Выделить всё

n <- c(1001:1003, 1004.3)

n <- round(n, digits = 1)
n <- format(n, big.mark = "'")

n[substring(n, nchar(n)-1, nchar(n)) == ".0"] <-
  substring(n, 1, nchar(n)-2)
Но не уверен, что это хороший способ. Еще и выводится непонятное для меня предупреждение:
Предупреждение:
В n[substring(n, nchar(n) - 1, nchar(n)) == ".0"] <- substring(n, :
число единиц для замены не является произведением длины замены


Спасибо!

Re: Округлить число и разбить на разряды

Добавлено: 17 июл 2020, 12:42
gamm
VistaSV30 писал(а): 17 июл 2020, 12:01 непонятное
понятное :mrgreen:

слева подмножество (индекс), справа весь вектор (правую часть тоже нужно индексировать)

Код: Выделить всё

ind = substring(n, nchar(n)-1, nchar(n)) == ".0"
n[ind] <- (substring(n, 1, nchar(n)-2))[ind]

но лучше запустить итератор, sapply(), и внутри смотреть, сколько знаков при форматировании, типа
if(round(x) == x) ...

Re: Округлить число и разбить на разряды

Добавлено: 17 июл 2020, 12:48
VistaSV30
Семейство apply() для меня пока загадка.
Видимо надо учить матчасть! :roll:

Надеялся, что в функциями format() или sprintf() можно это сделать...

Пробовал функцию gsub(".0", "", n), но она как-то странно работает, получилось: "101" "102" "103" "104.3"

Re: Округлить число и разбить на разряды

Добавлено: 17 июл 2020, 13:09
nickleb
:)

Код: Выделить всё

n <- c(1001:1003, 1004.3, 1005.123, 1006.123456789, 1007.987, 1008.9999)

N <- sapply(seq_along(n),
            function(i) {
              ifelse(n[i] == as.integer(n[i]), 
                     as.character(as.integer(n[i])),
                     as.character(n[i]))
            }
)

str(N)

Re: Округлить число и разбить на разряды

Добавлено: 17 июл 2020, 13:20
VistaSV30
Нашел хороший способ! :idea:

Код: Выделить всё

n <- c(1001:1003, 1004.3)

n <- round(n, digits = 1)
n <- format(n, big.mark = "'")
n <- gsub("\\.0", "", n)