【问题标题】:One column transformation with multiple conditions with regular expressions使用正则表达式的具有多个条件的一列转换
【发布时间】:2021-02-24 09:01:10
【问题描述】:

我有一个数据框:

ID       value
1      he following object is masked from ‘package:purrr’
2      Attaching package: ‘magrittr’
3      package ‘ggplot2’ was built under R version 3.6.2
4      Warning messages:

这是一个转换列值的代码:

df <- df %>% 
  mutate(value = stringr::str_replace(value, '(^he following object)', '\\1'),
         value = stringr::str_replace(value, '(^Attaching package:)', '\\1'),
         value = stringr::str_replace(value, '(^package ‘ggplot2’)', '\\1'))
) %>%   
  group_by(ID, value) 

输出是:

ID       value
1      he following object
2      Attaching package: 
3      package ‘ggplot2’
4      Warning messages:

如您所见,我在一列中多次使用 stringr::str_replace。我的实际数据要大得多(如数百万行)。这只是一个子集示例。那么,我怎样才能将这三次结合使用这个功能一次呢?我想使用相同的函数和库(没有根本的变化)

这个我试过了,还是不行:

df <- df %>% 
  mutate(value = str_replace_all(value, '(^he following object).*|(^Attaching package:).*|(^package ‘ggplot2’).*', '\\1')) %>%   
  group_by(ID, value)

它给了我这个:

ID       value
1      he following object’
2      
3     
4      Warning messages:

【问题讨论】:

    标签: r dataframe stringr stringi


    【解决方案1】:

    这就是你要找的吗?

    df %>% 
     mutate(value = stringr::str_replace_all(value, 
                                             c('(^he following object).*' = '\\1',
                                               '(^Attaching package:).*'= '\\1',
                                               '(^package ‘ggplot2’).*'= '\\1')
                                             ))
    #>   ID               value
    #> 1  1 he following object
    #> 2  2  Attaching package:
    #> 3  3   package ‘ggplot2’
    #> 4  4   Warning messages:
    

    请注意,我必须添加 .*,因为您的代码对我不起作用。它并没有取代整个句子。

    【讨论】:

    • 我认为最好使用 str_extract_all。对于非常长的字符串的情况。它应该是什么样子?
    • 为什么不使用@Ronak Shah 的解决方案?
    • 因为它没有给出想要的结果。列值中的第 4 行为空。您的代码有效,但我的数据在列值中有很长的字符串,所以当我使用 .* 时,处理需要很长时间。所以我想知道我可以用 str_starts 还是不用 .* 做同样的事情?
    • 您是否尝试过我对 coalesce 的建议? coalesce(str_extract(value, '^(he following object|Attaching package:|package ‘ggplot2)'), value) ?
    • 我看到 Ronak 用这个更新了他的答案。这可能就是您要寻找的。​​span>
    【解决方案2】:

    您可以使用str_extract,然后将coalesce 与现有值一起使用,而不是使用str_replace 并捕获带有反向引用的字符串。

    library(dplyr)
    library(stringr)
    
    df %>%
      mutate(value1 = str_extract(value, 
                    '^(he following object|Attaching package:|package ‘ggplot2)'), 
             value = coalesce(value1, value)) %>%
      select(-value1)
    
    #  ID               value
    #1  1 he following object
    #2  2  Attaching package:
    #3  3    package ‘ggplot2
    #4  4   Warning messages:
    

    【讨论】:

    • 因为您的预期输出是he following object 而不是he following object is masked from ‘package:purrr’。您只想提取与模式匹配的字符串部分。
    • 或者他可以用现有的coalescevalue
    • 想要的结果不同。列值中的第 4 行为空。我可以用 str_starts 做到这一点吗?
    • 正如@Edo 提到的,您可以coalesce 提取的值与现有值。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多