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

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

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

Сообщение VistaSV30 » 17 июл 2020, 12:01

Добрый день!
Подскажите как из вектора 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, :
число единиц для замены не является произведением длины замены


Спасибо!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 17 июл 2020, 12:42

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) ...

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

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

Сообщение VistaSV30 » 17 июл 2020, 12:48

Семейство apply() для меня пока загадка.
Видимо надо учить матчасть! :roll:

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

Пробовал функцию gsub(".0", "", n), но она как-то странно работает, получилось: "101" "102" "103" "104.3"
Последний раз редактировалось VistaSV30 17 июл 2020, 13:17, всего редактировалось 1 раз.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

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

Сообщение nickleb » 17 июл 2020, 13:09

:)

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

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)
Последний раз редактировалось nickleb 17 июл 2020, 14:11, всего редактировалось 1 раз.

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

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

Сообщение VistaSV30 » 17 июл 2020, 13:20

Нашел хороший способ! :idea:

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

n <- c(1001:1003, 1004.3)

n <- round(n, digits = 1)
n <- format(n, big.mark = "'")
n <- gsub("\\.0", "", n)
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей