【问题标题】:Changing values into numeric values将值更改为数值
【发布时间】:2019-06-24 15:27:22
【问题描述】:

我有几列的值为例如:525K 或 1.1M。我想将这些值转换为千或百万作为数字,而不使用除 baser 和 tidyr 之外的额外 R 包。

有没有人可以帮助我提供代码或功能,我如何以简单快捷的方式做到这一点?

我尝试手动删除“M”或“K”以及“.”。

players_set$Value <- gsub(pattern = "M", replacement = "000000 ", 
                           x = players_set$Value, fixed = TRUE)

【问题讨论】:

  • oak,gsub 有什么问题
  • 之前关于这个一般问题的几个问题here。
  • 问题是一些值有'M',一些有'K',而另一些也有'.'在它们的价值中,因此很难将它们组合在一起以使代码工作

标签: r


【解决方案1】:

对于基本 R 选项,我们可以尝试使用 sub 生成基于 K 或 M 单元的算术表达式。然后,使用eval 和parse 得到最终数字:

getValue <- function(input) {
    output <- sub("M", "*1000000", sub("K", "*1000", input))
    eval(parse(text=output))
}

getValue("525K")
getValue("1.1M")

[1] 525000
[1] 1100000

【讨论】:

  • eval(parse(....)) 的安全替代品是什么?我知道有几个相同的问题,但似乎确实没有安全的替代方案。
  • @NelsonGon 您是否询问输入文本可能不是有效的算术表达式或其他内容的可能性?
  • 不是真的,我在一些旧帖子的某处读到 eval(parse(..)) 在安全意识程序中使用时很危险。尽管我真的不知道 R 替代方案,但我也读过 python 的 eval(repr()) 相同的内容。喜欢here。
【解决方案2】:

这是另一个带有命名向量匹配的选项

getValue <- function(input) {
    # remove characters except LETTERS 
    v1 <- gsub("[0-9.€]+", "", input)
    # remove characters except digits
    v2 <- gsub("[A-Za-z€]+", "", input)
    # create a named vector
    keyval <- setNames(c(1e6, 1e3), c("M", "K"))
    # match the LETTERS (v1) with the keyval to get the numeric value
    # multiply with v2
    unname(as.numeric(v2) *keyval[v1])
}



getValue("525K")
#[1] 525000
getValue("1.1M")
#[1] 1100000

getValue("€525K")
#[1] 525000

getValue("€1.1M")
#[1] 1100000

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多