【问题标题】:multiple str_replace functions within the same mutate()同一个 mutate() 中的多个 str_replace 函数
【发布时间】:2022-01-10 20:52:45
【问题描述】:

我的虚拟代码:

x <- c("A", "B", "C", "D")
y <- c("<0.5", "~1", "<10", "~30")

df <- data.frame(x,y) %>%
  mutate(y1 = str_replace(y, "~", ""),
         y2 = as.numeric(str_replace(y1, "<", ""))/2)

基本上我想在 y 列做的是:

  • 从包含“~”的值中删除“~”
  • 从包含“

理想情况下,我会提供一个完整的数字列。

如何在不需要临时“y1”变量的情况下执行此步骤?我已经尝试将两者都放入 str_replace 但似乎不起作用,或者创建了 NA。我也尝试过在 str_replace 中使用管道,但这也不起作用。请注意,我只希望将“

谢谢。

【问题讨论】:

    标签: r string dplyr tidyverse stringr


    【解决方案1】:

    我们可以通过 OR 运算符连接多个删除条件:

    library(tidyverse)
    
    df <- data.frame(x = c("A", "B", "C", "D"),
                     y = c("<0.5", "~1", "<10", "~30"))
    
    df %>%
      mutate(y2 = as.numeric(str_remove(y, "<|~")),
             y2 = if_else(str_detect(y, '<'), 0.5 * y2, y2))
    

    给出:

      x    y    y2
    1 A <0.5  0.25
    2 B   ~1  1.00
    3 C  <10  5.00
    4 D  ~30 30.00
    

    通过覆盖 y 更新解决方案:

    df %>%
      mutate(y = if_else(str_detect(y, '<'), 0.5 * as.numeric(str_remove(y, "<|~")), as.numeric(str_remove(y, "<|~"))))
    

    给出:

      x     y
    1 A  0.25
    2 B  1.00
    3 C  5.00
    4 D 30.00
    

    当然,您也可以从解决方案 1 中删除旧的 y 列,并将 y2 重命名为 y。

    【讨论】:

    • 不幸的是,我只需要将包含“
    • 查看我的更新答案。
    • 谢谢,完美运行。出于好奇,如果我们在第一行中删除了“
    • 密切注意我提供给 str_detect 的变量!我通过 y,而不是 y2。
    • 我还有最后一个问题。理想情况下,我希望能够覆盖“y”列,而不是创建“y2”。有什么简单的方法可以简洁地做到这一点?谢谢。
    【解决方案2】:

    更新:查看操作的评论:

    library(tidyverse)
    df %>% 
      mutate(y = ifelse(str_detect(y, "<"), parse_number(y)/2, parse_number(y)))
    
      x     y
    1 A  0.25
    2 B  1.00
    3 C  5.00
    4 D 30.00
    

    @deschen 的回答很好。另一种方法是使用来自readr 包的parse_number

    library(tidyverse)
    
    df %>% 
      mutate(y2 = ifelse(str_detect(y, "<"), parse_number(y)/2, parse_number(y)))
    
      x    y    y2
    1 A <0.5  0.25
    2 B   ~1  1.00
    3 C  <10  5.00
    4 D  ~30 30.00
    

    【讨论】:

    • 感谢您。理想情况下,我希望能够覆盖“y”列,而不是创建“y2”。有什么简单的方法可以简洁地做到这一点?谢谢。
    • 请看我的更新!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多