代码之家  ›  专栏  ›  技术社区  ›  Nettle

将字符串移到新列并替换为na

  •  1
  • Nettle  · 技术社区  · 8 年前

    我想将一个值移到一个新列中,特别是:

    1。 检测是否存在正则表达式( string ),如果 TRUE
    2。 将值移动到新列,然后…
    三。 将原始字符串替换为NA

    我不知道有电流 move extract 这样做的功能,所以我的想法是创造一个我自己的。我想不出有什么问题。

    library(tidyverse)
    
    # Data
    x <- tibble(col1 = letters[1:5])
    
    #> # A tibble: 5 x 1
    #>   col1 
    #>   <chr>
    #> 1 a    
    #> 2 b    
    #> 3 c    
    #> 4 d    
    #> 5 e
    

    我想把结果放在一个整洁的函数中。

    x %>% 
      mutate(col2 = case_when(                         #<Detect regex; copy to col2
                      str_detect(col1, "[a]") ~ col1),
             col1 = case_when(                         #<remove from col1
                      col1 %in% col2 ~ "",             #<This should be NA
                      TRUE ~ col1),
             col1 = parse_character(col1))             #<parse col1 to NA
    
    #> # A tibble: 5 x 2
    #>   col1  col2   
    #>   <chr> <chr>  
    #> 1 <NA>  a      
    #> 2 b     NA
    #> 3 c     NA
    #> 4 d     NA
    #> 5 e     NA
    

    函数可能是这样的

    move_to_newcol <- function(my.dataframe, 
                            my.new.col.name, 
                            my.old.col.name, 
                            my.regex){...}
    

    于2018年6月19日由 reprex package (v0.2.0)。

    2 回复  |  直到 7 年前
        1
  •  1
  •   gymbrane    8 年前

    像这样的事情怎么样…

    编辑 :

    move_to_newcol <- function(df, old_col, new_col, regex){
      old_col_var <- dplyr::enquo(old_col)
      new_col_var <- dplyr::enquo(new_col)
      oldcol_name <- quo_name(old_col_var)
      newcol_name <- quo_name(new_col_var)
    
      dplyr::mutate(df , !! newcol_name := dplyr::case_when(stringr::str_detect((!! old_col_var), regex) ~ (!!old_col_var))) %>%
      dplyr::mutate(!! oldcol_name := dplyr::case_when(!! old_col_var %in% !!new_col_var ~  NA_character_ , TRUE ~ !! old_col_var))
    }
    

    我相信你已经有骨头了。然后你可以测试它,它能提供你想要的东西。

    move_to_newcol(x, col1, col2, "[a]")
    # A tibble: 5 x 2
     col1  col2 
    <chr> <chr>
    1 NA    a    
    2 b     NA   
    3 c     NA   
    4 d     NA   
    5 e     NA
    

    x %>% move_to_newcol(col1,col2, "[a]")
    
        2
  •  1
  •   Nettle    8 年前

    使用 friendlyeval Miles McBain(DATAPASTA的作者)的TiyEvavy简化API:

    library(tidyverse)
    library(friendlyeval)
    
    # Data
    x <- tibble(col1 = letters[1:5])
    
    
    move_to_newcol <- function(my.dataframe, my.old.col.name, my.new.col.name, my.regex){
    
      #Treat the literal text input provided as a dplyr column name.
        my.old.col.name <- treat_input_as_col(my.old.col.name)
        my.new.col.name <- treat_input_as_col(my.new.col.name)
    
      # friendlyeval looks almost identical to dplyr code
      x %>%  
        mutate(!!my.new.col.name := case_when(
                          str_detect(!!my.old.col.name, my.regex) ~ !!my.old.col.name),
               !!my.old.col.name := case_when(
                          !!my.old.col.name == !!my.new.col.name ~ NA_character_,
                          TRUE ~ !!my.old.col.name))
    }
    
    move_to_newcol(x, col1, col2, "[a]")
    
    #> # A tibble: 5 x 2
    #>   col1  col2 
    #>   <chr> <chr>
    #> 1 <NA>  a    
    #> 2 b     <NA> 
    #> 3 c     <NA> 
    #> 4 d     <NA> 
    #> 5 e     <NA>
    ```
    

    于2018年6月23日由 reprex package (v0.2.0)。