你如何隔离R中小数点后的数字?
How do you isolate the digits following a decimal in R?
例如:我有号码 123.456,想 return456。
函数 trunc()
基本上隔离 (truncates) 数字 在 小数点之前。
是否有函数可以仅隔离小数点之后的数字?
两个后续问题:
有没有办法不用写出正则表达式就可以做到这一点?
如果我想维护标志怎么办?例如,如果我想(反转)将 -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
我想使用模运算符 (%%) 和 1 作为设计器是可行的。它确实成功地隔离了小数点后的数字,但保留了小数点:
123.456 %% 1
[1] 0.456
然而,它仅适用于正数,因为符号不会保留,也不会报告正确的数字(b/c 模运算符的功能):
-123.456 %% 1
[1] 0.544 #not what is wanted
包含 abs()
可解决该问题,但无助于报告签名。可以通过添加来包含符号:
sign(x) * (abs(x) %% 1)
如果我们真的想报告只是小数点后的数字(即不包括0和小数点),我们可以执行以下操作(为清楚起见,分 2 个步骤呈现):
x <- -123.456
y <- sign(x) * (abs(x) %% 1)
as.numeric(gsub("0.","",y))
[1] -456 #as desired from part 2 in the OP
这是另一条路
> x <- c(123.456, -123.456)
> sign(x) * as.integer(sapply(strsplit(as.character(x), "\."), "[", 2))
[1] 456 -456
例如:我有号码 123.456,想 return456。
函数 trunc()
基本上隔离 (truncates) 数字 在 小数点之前。
是否有函数可以仅隔离小数点之后的数字?
两个后续问题:
有没有办法不用写出正则表达式就可以做到这一点?
如果我想维护标志怎么办?例如,如果我想(反转)将 -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
我想使用模运算符 (%%) 和 1 作为设计器是可行的。它确实成功地隔离了小数点后的数字,但保留了小数点:
123.456 %% 1
[1] 0.456
然而,它仅适用于正数,因为符号不会保留,也不会报告正确的数字(b/c 模运算符的功能):
-123.456 %% 1
[1] 0.544 #not what is wanted
包含 abs()
可解决该问题,但无助于报告签名。可以通过添加来包含符号:
sign(x) * (abs(x) %% 1)
如果我们真的想报告只是小数点后的数字(即不包括0和小数点),我们可以执行以下操作(为清楚起见,分 2 个步骤呈现):
x <- -123.456
y <- sign(x) * (abs(x) %% 1)
as.numeric(gsub("0.","",y))
[1] -456 #as desired from part 2 in the OP
这是另一条路
> x <- c(123.456, -123.456)
> sign(x) * as.integer(sapply(strsplit(as.character(x), "\."), "[", 2))
[1] 456 -456