将字符串移动到新列并替换为 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
我不知道当前的 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
这是我想放入 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。
我想将一个值移到新列中,特别是:
1. Detect presence of a regex (
string
), and ifTRUE
...
2. Move value to a new column, and...
3. Replace original string with 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
这是我想放入 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。