【问题标题】:Place a decimal point into a number将小数点放入数字中
【发布时间】:2021-12-30 21:50:50
【问题描述】:

我有一个包含数字的 df 变量,但我需要将其转换为小数

一个例子:

[1]  NA  NA  NA 595 595   5

所以我需要创建一个新变量或对其进行转换以获得以下形式

[1]  NA NA NA 5.95 5.95 5.0

但我还没有找到方法,如果有任何帮助,我将不胜感激

我正在寻找方法,但我唯一找到的是一个 stata 命令

destring v1, g(new_var) dpcomma
     drop v1

我不明白

str 的结果

num [1:308535] NA NA NA 595 595 5 625 645 59 54 ...

来自 dput 的摘录

515, 555, 478, 665, 635, 555, 608, 578, 633, 62, 59, 608, 498, 
603, 54, 638, 565, 625, NA, 545, 613, 573, 543, 653, 523, 568, 
508, 635, 625, 598, 62, 565, 545, 655, 628, 52, 588, 598, 55, 
598, 55, 578, 515, 64, 54, 54, 625, 565, 608, 588, 618, 535, 
603, 663, 558, 638, 59, 518, 54, 613, 495, 535, 51, 543, 613, 
583, 58, 593, 498, 568, 538, 525, 653, 555, 588, 56, 505, 54, 
618, 56, 623, 508, 595, 6, 585, 518, 545, 525, 603, 588, 575, 
568, 568, 588, 595, 593, 565, 535, 563, 643, 57, 645, 608, 608, 
555, 57, 54, 555, 61, 528, 623, 653, 618, 528, 563, 63, 538, 
52, 563, 51, 538, 525, 558, 568, NA, 523, 623, NA, 603, 555, 
48, 633, 575, 583, 54, 578, 56, 65, 525, 5, 595, 663, 618, 59, 
603, 525, 54, 555, 625, 528, 538, 67, 64, 528, 623, 615, 565, 
548, 65, 508, 653, 63, 58, 553, 553, 548, 575, 553, 538, 583, 
565, 613, 608, 68, 55, 605, 675, 585, 533, 565, 515, 525, 568, 

【问题讨论】:

  • 欢迎来到 Stack Overflow!我们需要更多信息,请:(1)您能否将str(df$var)dput(df$var) 的结果包含在您的问题中,以便我们可以确切地看到您拥有什么? (2) 你能澄清一下字符串中的所有变量在转换后都应该在小数点左边有一个值吗? (3)您的标题谈到逗号,但我在您的问题中没有看到任何逗号。您的意思是“小数分隔符”(通常是 .,但在某些欧洲语言环境中可以是 ,)?
  • 我不知道我是否正确理解了这个问题,但似乎你可以将原始变量除以 100。在 R df$newVar <- df$originalVar / 100
  • @MikeKatz45 我想到了,但我需要将所有数字传递给速率,例如,如果我有 5,我需要它作为 5.0,如果我有 567,我需要它是 5.67,所以如果我将变量除以 100 y 将得到 0.05 而不是 5.0
  • 您的逻辑描述不足,但请考虑ifelse 函数:x / ifelse(x < 100, 1, 100) 可能是您正在寻找的。​​span>
  • (1) 请不要给出“从 dput 中提取的内容”。最好从数据提取中给出dput。不同之处在于dput 的(未经编辑的)输出对我们立即可用,而您当前的提取仍然需要一些工作才能使用,并且我们在您的对象结构的其余部分中仍然没有上下文。 (2) 请花一点时间来描述一下你所说的“将所有数字传递给一个比率”的意思,这是否意味着任何低于100的东西已经很好,超过100需要被缩放? 我们不知道。

标签: r


【解决方案1】:

这样的事情应该可以工作(假设您的输入永远不会是 0,如果发生这种情况,您需要在过程结束时将 Inf 值设置为 0):

# first define a function that will to the job
toRate <- function(x) {      

  # get number of digits minus one
  ndigits <- ceiling(log10(abs(x))) - 1 # or use floor and skip the -1
  # divide by a power of 10 according to number of digits
  y <- x / (10^ndigits)


  return(y)
}

original <- c(515, 555, 478, 665, 635, 555, 608, 578, 633, 62, 59, 608, 498, 
603, 54, 638, 565, 625, NA, 545, 613, 573, 543, 653, 523, 568, 
508, 635, 625, 598, 62, 565, 545, 655, 628, 52, 588, 598, 55, 
598, 55, 578, 515, 64, 54, 54, 625, 565, 608, 588, 618, 535, 
603, 663, 558, 638, 59, 518, 54, 613, 495, 535, 51, 543, 613, 
583, 58, 593, 498, 568, 538, 525, 653, 555, 588, 56, 505, 54, 
618, 56, 623, 508, 595, 6, 585, 518, 545, 525, 603, 588, 575, 
568, 568, 588, 595, 593, 565, 535, 563, 643, 57, 645, 608, 608, 
555, 57, 54, 555, 61, 528, 623, 653, 618, 528, 563, 63, 538, 
52, 563, 51, 538, 525, 558, 568, NA, 523, 623, NA, 603, 555, 
48, 633, 575, 583, 54, 578, 56, 65, 525, 5, 595, 663, 618, 59, 
603, 525, 54, 555, 625, 528, 538, 67, 64, 528, 623, 615, 565, 
548, 65, 508, 653, 63, 58, 553, 553, 548, 575, 553, 538, 583, 
565, 613, 608, 68, 55, 605, 675, 585, 533, 565, 515, 525, 568)
df <- cbind.data.frame(original = original)
df$new <- toRate(df$original)

输出:

df$new
[1] 5.15 5.55 4.78 6.65 6.35 5.55
  [7] 6.08 5.78 6.33 6.20 5.90 6.08
 [13] 4.98 6.03 5.40 6.38 5.65 6.25
 [19]   NA 5.45 6.13 5.73 5.43 6.53
 [25] 5.23 5.68 5.08 6.35 6.25 5.98
 [31] 6.20 5.65 5.45 6.55 6.28 5.20
 [37] 5.88 5.98 5.50 5.98 5.50 5.78
 [43] 5.15 6.40 5.40 5.40 6.25 5.65
 [49] 6.08 5.88 6.18 5.35 6.03 6.63
 [55] 5.58 6.38 5.90 5.18 5.40 6.13
 [61] 4.95 5.35 5.10 5.43 6.13 5.83
 [67] 5.80 5.93 4.98 5.68 5.38 5.25
 [73] 6.53 5.55 5.88 5.60 5.05 5.40
 [79] 6.18 5.60 6.23 5.08 5.95 6.00
 [85] 5.85 5.18 5.45 5.25 6.03 5.88
 [91] 5.75 5.68 5.68 5.88 5.95 5.93
 [97] 5.65 5.35 5.63 6.43 5.70 6.45
[103] 6.08 6.08 5.55 5.70 5.40 5.55
[109] 6.10 5.28 6.23 6.53 6.18 5.28
[115] 5.63 6.30 5.38 5.20 5.63 5.10
[121] 5.38 5.25 5.58 5.68   NA 5.23
[127] 6.23   NA 6.03 5.55 4.80 6.33
[133] 5.75 5.83 5.40 5.78 5.60 6.50
[139] 5.25 5.00 5.95 6.63 6.18 5.90
[145] 6.03 5.25 5.40 5.55 6.25 5.28
[151] 5.38 6.70 6.40 5.28 6.23 6.15
[157] 5.65 5.48 6.50 5.08 6.53 6.30
[163] 5.80 5.53 5.53 5.48 5.75 5.53
[169] 5.38 5.83 5.65 6.13 6.08 6.80
[175] 5.50 6.05 6.75 5.85 5.33 5.65
[181] 5.15 5.25 5.68

【讨论】:

  • 非常感谢
  • 请考虑与花时间审查它的人的 cmets 改进您的问题
【解决方案2】:

另一种选择是在带有stringr::str_sub 的第一个字符之后插入.,然后转换回numeric

x <- c(515, 555, 478, 665, 635, 555, 608, 578, 633, 62, 59)

stringr::str_sub(x, 2, 1) <- "."

as.numeric(x)

#----

[1] 5.15 5.55 4.78 6.65 6.35 5.55 6.08 5.78 6.33 6.20 5.90

或者使用基本函数sub

as.numeric(sub("^(.{1})", "\\1\\.", x)) 

【讨论】:

    【解决方案3】:

    你可以这样做:

    x/10^(nchar(x) - 1)
    
     [1] 5.15 5.55 4.78 6.65 6.35 5.55 6.08 5.78 6.33 6.20 5.90
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多