【问题标题】:How to code a substr version that holds leading zeros in numeric values (in R)?如何编写在数值(在 R 中)中包含前导零的 substr 版本?
【发布时间】:2019-05-28 07:32:14
【问题描述】:

在准备一个将标准化双精度数转换为十进制数的函数时,我需要以下内容:

substr(01001011, 2, 5) # what is in fact:"0010" (because leading 0 is ignored)
substr(01001011, 2, 5) # what I want:"1001"
substr("01001011", 2, 5) # "1001"; gives what I want BUT the following:

substr("01001011", 2, 5) 中,(对我而言)不可能将其转换为函数,因为input=01001011 和双引号连接非常有问题。每次用户必须手动输入参数的值,而不是在函数调用中,而是在 substr(...) 部分所在的函数体中。

01001011 被保留为数字,因此所有前导 0 都被忽略。

01001011 # [1] 1001011
class(01001011) # "numeric"

substrCorrectly <- function(x) {
substr("x", 2, 5) }

例如,对于数字“01001011”;

substrCorrectly <- function(x) {
substr("01001011", 2, 5) }
substrCorrectly(01001011) # "1001"

这个函数肯定很丑,和函数的概念背道而驰:每次用户在应用之前都必须改变函数体!

有什么想法吗?

更多示例:

substr(000101001011, 1, 4) # "1010"; but what I want is 0001 here. 
substr(10001, 1, 2) # "10" and what I want (10) coincides since 1 is leading. 

【问题讨论】:

  • 有没有办法计算出这个数字应该有多少位数?在您提供的第一个示例中,它始终是 8....
  • @kath 是的,有一种方法:在内存中数字的标准化双精度存储中,第 0 位是符号,第 1-11 位(11 位)是指数,第 12-63 位(52 位)是有效数字。因此,您可以假设手头数字的位数总是 11 位!
  • 希望对您有所帮助:formatC(000101001011, flag = "0", width = 12, format = "d")
  • sprintf, substr(sprintf("%012d", 000101001011), 1, 4)
  • Clemsang 可以继续写一个解决方案,因为他首先评论。基本上它是以不同的方式完成的同一件事。我们也可以使用来自stringrstr_pad。最初,我不知道字符串的长度是已知的。

标签: r string double substr


【解决方案1】:

您可以使用formatC,这将允许保留第一个0s

substrCorrectly <- function(x) { 
  x <- formatC(x, flag="0", width=8, format="d") 
  substr(x, 2, 5) 
}
substrCorrectly(01001011) # "1001"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2021-07-10
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多