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

时间:2018-06-20 02:49:46

标签: r dplyr data-munging

我想将值移动到新列,具体来说:

  

1。。检测是否存在正则表达式(string),如果存在TRUE ...
    2。。将值移到新列,然后...
    3。用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){...}

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

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样...

编辑

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

答案 1 :(得分:1)

使用friendlyeval,这是Miles McBain(datapasta的作者)整理的“简化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创建。