我想将值移动到新列,具体来说:
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创建。
答案 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创建。