У меня есть набор данных, который мне нравится вменять в одно значение среди других, основываясь на вероятностном распределении этих значений. Давайте сначала создадим какой-нибудь воспроизводимый пример
library(tidyverse)
library(janitor)
dummy1 <- runif(5000, 0, 1)
dummy11 <- case_when(
dummy1 < 0.776 ~ 1,
dummy1 < 0.776 + 0.124 ~ 2,
TRUE ~ 5)
df1 <- tibble(q1 = dummy11)
вот результат:
df1 %>% tabyl(q1)
q1 n percent
1 3888 0.7776
2 605 0.1210
5 507 0.1014
Я использовал mutate
и sample
, чтобы разделить значение = 5 среди значений 1 и 2, как это:
df1 %>%
mutate(q1 = case_when(q1 == 5 ~ sample(
2,
length(q1),
prob = c(0.7776, 0.1210),
replace = TRUE
),
TRUE ~ as.integer(q1))
)
и вот результат:
q1 n percent
1 4322 0.8644
2 678 0.1356
Этот подход кажется работающим, однако, поскольку мне нужно применить это для нескольких переменных, я попытался написать функцию, которая работает с tidyverseс tidyeval
, вот так
my_impute <- function(.data, .prob_var, ...) {
.prob_var <- enquo(.prob_var)
.data %>%
sample(2, prob=c(!!.prob_var), replace = TRUE)
}
# running on data
df1 %>%
mutate(q1 = case_when(q1 == 5 ~ !!my_impute(q1),
TRUE ~ as.integer(q1))
)
Ошибка:
Error in eval_tidy(pair$lhs, env = default_env) : object 'q1' not found