Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中分隔小数点后的数字?_R_Decimal_Digit_Isolation_Truncated - Fatal编程技术网

如何在R中分隔小数点后的数字?

如何在R中分隔小数点后的数字?,r,decimal,digit,isolation,truncated,R,Decimal,Digit,Isolation,Truncated,例如:我有号码123.456,想返回456 函数trunc()基本上分离()小数点前的数字 是否有一个功能仅隔离小数点后的数字? 两个后续问题: 有没有办法不用写正则表达式就可以做到这一点 如果我想保留这个标志怎么办?例如,如果我想(反向)将-123.456截断为-456 我不喜欢这种操作的文本处理 棘手的部分是将小数转换成整数。这里我使用一个循环。不太可能需要多次迭代。因此,性能可能不是问题 fun <- function(x) { y <- abs(x) - floor(ab

例如:我有号码123.456,想返回456

函数
trunc()
基本上分离()小数点前的数字

是否有一个功能仅隔离小数点后的数字?

两个后续问题:

  • 有没有办法不用写正则表达式就可以做到这一点

  • 如果我想保留这个标志怎么办?例如,如果我想(反向)将-123.456截断为-456


  • 我不喜欢这种操作的文本处理

    棘手的部分是将小数转换成整数。这里我使用一个循环。不太可能需要多次迭代。因此,性能可能不是问题

    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
    
    fun我想使用模运算符(%)和1作为除法器是可行的。它确实成功地隔离了小数点后的数字,但保留了小数点:

    123.456 %% 1
    [1] 0.456
    
    但是,它仅适用于正数,因为符号没有保留,也没有报告正确的数字(模运算符功能的b/c):

    包括
    abs()。可通过添加以下内容来包括该标志:

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

    这是另一条路

    > x <- c(123.456, -123.456)
    > sign(x) * as.integer(sapply(strsplit(as.character(x), "\\."), "[", 2))
    [1]  456 -456
    
    >x符号(x)*作为.integer(sapply(strsplit)(作为.character(x),“\\”,“[”,2))
    [1]  456 -456
    
    符号(x)*(abs(x)%%%1)
    @Gregor那不是
    x-trunc(x)
    ?哎呀,错过了需要一个整数。似乎浮点算术问题正等着把你搞砸。很高兴有很多答案都能解决这个问题,但把它保留为十进制似乎更安全。出于好奇:这有什么用例?@Roland,我真的只需要它来测试非整数的存在。我是我对如何进一步扩展这个概念很感兴趣,主要是出于好奇。但是,后来我发现我无法想出一个圆滑的方法来解决这个问题,所以我问了。
    > x <- c(123.456, -123.456)
    > sign(x) * as.integer(sapply(strsplit(as.character(x), "\\."), "[", 2))
    [1]  456 -456