Не ясно, идет ли речь о красивой печати (результат символ ) или округлении (результат цифра c).
Если вопрос о преобразовании в символ для красивой печати, можно использовать функцию sprintf()
.
Функция sprintf()
понимает спецификатор преобразования g
, где может быть указано число значащих цифр . Однако он не охватывает весь диапазон значений. Поэтому необходимо использовать различные спецификаторы преобразования в зависимости от размера y
:
y <- c(0.0111, 0.111, 1.11, 11.1, 111.1, 1111, 11111)
sprintf(c("%3.2f", "%3.3g", "%3.0f")[cut(y, c(0, 1, 1000, Inf))], y)
[1] "0.01" "0.11" "1.11" "11.1" "111" "1111" "11111"
Если речь идет о округлении чисел c значений:
round(y, c(2, 1, 0)[cut(y, c(0, 10, 100, Inf))])
[1] 0.01 0.11 1.11 11.10 111.00 1111.00 11111.00
Объяснение
c("%3.2f", "%3.3g", "%3.0f")[cut(y, c(0, 1, 1000, Inf))]
является заменой для вложенного ifelse()
, чтобы выбрать правильный спецификатор преобразования для каждого y
:
[1] "%3.2f" "%3.2f" "%3.3g" "%3.3g" "%3.3g" "%3.0f" "%3.0f"
cut()
преобразуется из числа c в коэффициент. Он делит диапазон y
на интервалы и кодирует значения в y
в зависимости от того, на какой интервал они попадают. Крайний левый интервал соответствует первому уровню, следующий левый - второму уровню и так далее. (от help("cut")
).
Затем номер уровня используется для подстановки вектора спецификаторов преобразования для выбора соответствующего спецификатора в соответствии со значением y
.
Во время записи Пояснение, есть немного другой подход. Вместо того, чтобы использовать номера уровней для подстановки вектора спецификаторов преобразования, мы можем напрямую использовать метки уровней:
sprintf(as.character(cut(y, c(0, 1, 1000, Inf), labels = c("%3.2f", "%3.3g", "%3.0f"))), y)
[1] "0.01" "0.11" "1.11" "11.1" "111" "1111" "11111"