首页 > 解决方案 > R将操作写入函数并迭代

问题描述

我有这个输入(样本):

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. 第一个操作是minimum_term从数据帧中获取input并将所有“无”实例替换为“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))
}

标签: rdplyrpurrrstringr

解决方案


如果有多个列,请使用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

推荐阅读