【问题标题】:How to write function to alter a string and also do arithmetic如何编写函数来更改字符串并进行算术运算
【发布时间】:2019-12-18 13:23:06
【问题描述】:

我在数据框中有一个变量,其中包含的值要么是 Varies with device,要么是 a number with M,要么是 a number with k

例如:

10M
1.2M
120k
Varies with device

我想使用the values with M 并简单地删除M,我想使用the values with k 并删除k 并将它们乘以0.001。

示例输出:

10
1.2
0.12
Varies with device

我希望输出在dataframe 中的一个变量中,或者替换原始变量,或者作为一个新变量。

我试图创建一个这样的函数,但我无法让它工作。

convert <- function(x) {
  if(grep("M$", x)) {
  str_sub(x, 1, -1)
  as.numeric(x)
  } else if(grep("k$", x)) {
    str_sub(x, 1, -1)
    as.numeric(x)
    (x*0.001)
  }
}

【问题讨论】:

    标签: r dataframe data-manipulation


    【解决方案1】:
    test <- c("10M 1.2M 120k Varies with device")
    
    library(stringr)
    library(magrittr)
    
    str_replace_all(test,"[0-9\\.]+(?=k)",function(x){as.numeric(x)/1000}) %>%
      gsub("k|M","",.)
    
    [1] "10 1.2 0.12 Varies with device"
    

    函数str_replace_all 将匹配的模式替换为其他模式,或由函数转换的匹配模式。我在这里用它来除以每 1000 个数字 [0-9\\.]+ 后跟 k (?=k)

    然后我用 gsub 删除 k 和 M(我匹配 k 或 M "k|M" 并将其替换为空)

    它也适用于矢量

    test <- c("10M","1.2M", "120k"," Varies with device")
    str_replace_all(test,"[0-9\\.]+(?=k)",function(x){as.numeric(x)/1000}) %>%
       gsub("k|M","",.)
    
    [1] "10"                  "1.2"                 "0.12"                " Varies with device"
    

    【讨论】:

    • 谢谢!它似乎适用于测试数据,但不适用于我的数据。它唯一做错的事情是所有具有“k”的值都变为NA。你知道为什么会这样吗?例如,“201k”变成了 NA。
    • 它对我有用,即使是“201k”。你加载了library(stringr) 吗?您能否通过示例重现您的问题并编辑您的问题?
    【解决方案2】:

    我对您的功能做了一些调整。它现在应该可以正常工作了。

    convert <- function(x) {
      if(length(grep("M$", x)) > 0) {
        x <- str_sub(x, 1, nchar(x)-1)
        as.numeric(x)
      } else if(length(grep("k$", x)) > 0) {
        x <- str_sub(x, 1, nchar(x)-1)
        as.numeric(x)*0.001
      } else {
        x
      }
    
    }
    

    【讨论】:

    • 感谢您向我展示如何编辑它!然而,它将“随设备变化”变成了 NA,虽然它确实删除了“M”和“k”,但它并没有像应有的那样乘以“k”值。关于我可以做些什么来让它发挥作用的任何想法?
    • 嗯,它可以在我的机器上运行...字符串中有空格吗,例如"120M "... str_sub 函数不会删除 M 而只是删除空格。
    • 它似乎正在删除 M 和 k,但它只是没有将附加到 k 的数字乘以 0.001。它会改变 NAs 中的其他值...
    • 这样应用函数:df$var_converted &lt;- sapply(df$var_unconverted, convert)
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2015-02-06
    • 2017-01-10
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多