【问题标题】:Separate rows on string & preserving original在字符串上分隔行并保留原始行
【发布时间】:2023-03-21 12:28:02
【问题描述】:

我正在做一个项目,我想要特定字符串的所有排列。我正在使用tidyr::separate_rows 在特定字符串上拆分和复制,但我想保留原始行。

require(dplyr)
require(tidyr)
temp <- tibble(raw_name = c("happy bank dba american bank and trust", " sohappy bank dba american bank"), clean_name = c("american bank and trust", "american bank"))

这就是我现在正在做的事情:

final <- temp %>%
    separate_rows(raw_name, sep = "dba") 

这会丢失我原来的行。我查看了文档,但没有找到 .keep_all = TRUE 的版本。这是上面separate_rows的结果:

  raw_name                               clean_name             
  <chr>                                  <chr>                  
1 happy bank dba american bank and trust american bank and trust
2 " sohappy bank dba american bank"      american bank          

我当前的解决方案是创建一个带有违规观察的新 df,执行 separate_rows 并 rbind 原始行。这是我想要的结果:

raw_name                               clean_name             
  <chr>                                  <chr>                  
1 happy bank dba american bank and trust american bank and trust
2 " sohappy bank dba american bank"      american bank          
3 "happy bank "                          american bank and trust
4 " american bank and trust"             american bank and trust
5 " sohappy bank "                       american bank          
6 " american bank"                       american bank          

谢谢大家!

【问题讨论】:

    标签: r regex tidyr data-cleaning


    【解决方案1】:

    行分离后,我们可以与原始数据集进行绑定

    library(dplyr)
    library(tidyr)
    temp %>% 
      separate_rows(raw_name, sep="\\s*dba\\s*") %>%
      bind_rows(temp, .)
    # A tibble: 6 x 2
    #  raw_name                                 clean_name             
    #* <chr>                                    <chr>                  
    #1 "happy bank dba american bank and trust" american bank and trust
    #2 " sohappy bank dba american bank"        american bank          
    #3 "happy bank"                             american bank and trust
    #4 "american bank and trust"                american bank and trust
    #5 " sohappy bank"                          american bank          
    #6 "american bank"                          american bank       
    

    【讨论】:

    • 感谢您的成功。您能否为 dba 周围的\\s* \\s* 提供更多背景信息?这只是捕获额外的空间还是在做其他事情?
    • @Francisco * 意味着零个或多个空格 (\\s) 即。捕捉之前或之后的空间
    【解决方案2】:

    基于@akrun 的回答,我们可以有另一种方法

    temp <- data.frame(raw_name = c("happy bank dba american bank and trust", 
                                " sohappy bank dba american bank"), 
                   clean_name = c("american bank and trust", "american bank"), stringsAsFactors = FALSE)
    
    temp2 <- temp %>% 
      mutate(raw_name = strsplit(raw_name, "\\s*dba\\s*")) %>% 
      unnest(raw_name) %>% 
      bind_rows(temp)
    

    输出

      raw_name                                 clean_name             
      <chr>                                    <chr>                  
    1 "happy bank"                             american bank and trust
    2 "american bank and trust"                american bank and trust
    3 " sohappy bank"                          american bank          
    4 "american bank"                          american bank          
    5 "happy bank dba american bank and trust" american bank and trust
    6 " sohappy bank dba american bank"        american bank 
    

    更新:如果你想去掉字符串开头的空格,你可以试试:

    Library(stringr)
    temp2$raw_name <- str_squish(temp2$raw_name)
    output:
      raw_name                               clean_name             
      <chr>                                  <chr>                  
    1 happy bank                             american bank and trust
    2 american bank and trust                american bank and trust
    3 sohappy bank                           american bank          
    4 american bank                          american bank          
    5 happy bank dba american bank and trust american bank and trust
    6 sohappy bank dba american bank         american bank
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2022-11-03
      • 1970-01-01
      • 2017-12-02
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多