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

Move string to new column and replace with NA

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

1. Detect presence of a regex (string), and if TRUE...
2. Move value to a new column, and...
3. Replace original string with NA

我不知道当前的 moveextract 函数可以执行此操作,所以我的想法是创建一个我自己的。我无法弄清楚这些问题。

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

这是我想放入 tidy 函数中的结果。

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){...}

reprex package (v0.2.0) 创建于 2018-06-19。

这样的事情怎么样...

编辑:

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]")

使用 friendlyeval,Miles McBain(datapasta 的作者)的 tidyeval 'simplified 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>
```

reprex package (v0.2.0) 创建于 2018-06-23。