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))
- 第一个操作是从数据帧
input
中取出 minimum_term
并将“None”的所有实例替换为“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
我有这个输入(示例):
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))
- 第一个操作是从数据帧
input
中取出minimum_term
并将“None”的所有实例替换为“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