r - 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))
- 第一个操作是
minimum_term
从数据帧中获取input
并将所有“无”实例替换为“0”。 - 然后第二个操作是提取数字。
- 第三是转换为数字。
我有更多类似的列,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