2016-09-30 5 views
3

Например: у меня есть номер 123.456 и хочет вернуться 456.Как вы изолируете цифры после десятичного числа в R?

Функция trunc() в основном изолят (truncates) чисел перед тем десятичных.

Есть функция, чтобы изолировать только цифры после десятичной?

Два последующих вопросов:

  1. Есть ли способ сделать это, не выписывая регулярное выражение?

  2. Что делать, если я хочу сохранить знак? Например, если бы я хотел (обратный) обрезать -123.456 до -456.

+0

'знак (х) * (абс (х) %% 1)' – Gregor

+0

@Gregor бы не то, что будет 'х-TRUNC (х)'? – lukeA

+0

Ooops, пропустил, что требуется целое число. Кажется, что арифметические вопросы с плавающей запятой ждут вас. Приятно, что многие ответы позаботятся об этом, но оставляя его как десятичное, кажется более безопасным. – Gregor

ответ

3

Мне не нравится обработка текста для этих видов операций.

Сложная часть преобразует дробное число в целое число. Здесь я использую цикл. Маловероятно, что требуется много итераций. Таким образом, производительность, вероятно, не является проблемой.

fun <- function(x) { 
    y <- abs(x) - floor(abs(x)) 

    n <- 0 
    while (abs(y - round(y, n)) > .Machine$double.eps^0.5) { 
    n <- n + 1 
    } 

    sign(x) * y * 10^n 
} 

fun(123.456) 
#[1] 456 
fun(-123.456) 
#[1] -456 
2

Использование оператора modulo (%%) с 1, как работает devisor, я думаю. Он успешно изолирует число после десятичной, но оставляет десятичный:

123.456 %% 1 
[1] 0.456 

Однако это работает только для положительных чисел в том, что знак не сохраняются и не является соответствующими числами сообщенных (б/с функциональностью по модулю оператора):

-123.456 %% 1 
[1] 0.544 #not what is wanted 

В том числе abs() исправления, выпуск, но не помогает отчету знака. Знак может быть включен путем добавления:

sign(x) * (abs(x) %% 1) 
1

Это еще один путь

> x <- c(123.456, -123.456) 
> sign(x) * as.integer(sapply(strsplit(as.character(x), "\\."), "[", 2)) 
[1] 456 -456 

 Смежные вопросы

  • Нет связанных вопросов^_^