R将操作写入函数并迭代

R writing operations into a function and iterating

我有这个输入(示例):

input <- tibble(
  minimum_term = c("None", "6 Months", "12 Months"),
  maximum_term = c("None", "18 Months", "24 Months"),
  other_cols
)

我想得到这个输出:

desired_output <- tibbe(
  minimum_term = c(0, 6, 12),
  maximum_term = c(0, 18, 24),
  other_cols
)

我怎样才能更简洁地写出以下内容(也许在一个函数中并使用 purrr::map?)

library(dplyr)
library(stringr)

input <- input %>% 
  mutate(minimum_term = str_replace(
    minimum_term,
    'None',
    "0"
  )
  )

input <- input %>% 
  mutate(minimum_term = str_extract(minimum_term, '[0-9]{1,2}'))

output <- input %>% 
  mutate(minimum_term = as.numeric(minimum_term))
  1. 第一个操作是从数据帧 input 中取出 minimum_term 并将“None”的所有实例替换为“0”。
  2. 第二个操作是提取数字。
  3. 三是转成数字

我有更多类似于 minimum_term 的列,所以我很想将其放入可管道函数中并使用 purrr,但不确定如何执行此操作,我的第一次尝试:

term_replacement <- function(df, x){
  df <- df %>% 
    mutate(x = str_replace(
       x,
      'None',
      "0"
    )
  )
  df <- df %>% 
    mutate(x = str_extract(x, '[0-9]{1,2}'))
  df <- df %>%
    mutate(x = as.numeric(x))
}

如果有多个列,使用across

library(stringr)
library(dplyr)
library(tidyr)
term_replacement <- function(df, cols){
      df %>%
           mutate(across(all_of(cols), ~ replace_na(readr::parse_number(.), 0)))
}

将函数调用为(根据需要更改列名称)

term_replacement(input, c("minimum_term", "maximum_term"))

0输出

# A tibble: 3 x 2
  minimum_term maximum_term
         <dbl>        <dbl>
1            0            0
2            6           18
3           12           24