【问题标题】:Replace part of string with mutate (in a pipe)用 mutate 替换部分字符串(在管道中)
【发布时间】:2020-01-26 13:15:23
【问题描述】:

我想替换字符串的一部分(在前两个下划线之间,第一组始终为“i”),如下面的基本 R 示例:

library(dplyr)
library(stringr)

d <- tibble(txt = c("i_0000_GES", "i_0000_OISO", "i_0000_ASE1333"),
            repl = c("1111", "1111", "2222"))

str_sub(d$txt, 3, 6) <- d$repl
d

# A tibble: 3 x 2
# txt            repl 
# <chr>          <chr>
# 1 i_1111_GES     1111 
# 2 i_1111_OISO    1111 
# 3 i_2222_ASE1333 2222  

如何使用str_sub&lt;- 或其他字符串函数来做到这一点?

【问题讨论】:

  • 它不是已经在做你描述的事情了吗?
  • 问题是(实际上)在 str_sub 的上方和下方有一对 dplyr/magrittr-pipes。我需要将 str_sub 放入一个 mutate 左右。
  • 类似d %&gt;% mutate(repl_pipe=str_sub(txt,3,6))
  • 或者像这样:d %&gt;% mutate(txt = str_replace(txt, '\\d+', repl))

标签: r dplyr tidyverse stringr


【解决方案1】:

这是在管道中使用str_sub&lt;- 的一种方法。

d %>%
  mutate(txt = `str_sub<-`(txt, 3, 6, value = repl))
## A tibble: 3 x 2
#  txt            repl 
#  <chr>          <chr>
#1 i_1111_GES     1111 
#2 i_1111_OISO    1111 
#3 i_2222_ASE1333 2222 

请注意,参数value 是最后一个,因此必须将其传递给它的名称。

【讨论】:

    【解决方案2】:
    d %>% 
      mutate(txt = str_replace(txt, '0000', repl))
    

    虽然使用正则表达式而不是 '0000' 可能会更好。

    【讨论】:

      【解决方案3】:

      你可能会这样做:

      d %>%
       mutate(txt = str_replace(txt, str_sub(txt, 3, 6), repl))
      
        txt            repl 
        <chr>          <chr>
      1 i_1111_GES     1111 
      2 i_1111_OISO    1111 
      3 i_2222_ASE1333 2222
      

      这里你首先是子字符串,然后用repl替换这个子字符串。

      或者:

      d %>%
       mutate(txt = {str_sub(txt, 3, 6) <- repl; txt})
      

      【讨论】:

        【解决方案4】:

        有了base R,我们可以使用substring

        substring(d$txt, 3, 6) <- d$repl
        

        【讨论】:

          猜你喜欢
          • 2020-12-14
          • 2021-03-25
          • 2018-05-17
          • 2012-07-17
          • 2018-01-22
          • 2012-04-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多