【发布时间】:2020-02-13 13:16:13
【问题描述】:
我有一个数据集,我喜欢根据这些值的概率分布在其他值中估算一个值。让我们先做一些可重现的例子
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 在值 1 和 2 之间共享值 = 5,如下所示:
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
这种方法似乎有效,但是由于我需要将其应用于多个变量,因此我尝试编写一个与 tidyeval 一起使用 tidyverse 的函数,就像这样
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
【问题讨论】:
-
在最后一部分中,您从原始数据集中传递
prob,其中 'q1' 为integer在函数外部,它似乎基于tabyl输出 -
对不起@akrun,我不关注,q1 是 1、2 或 5。啊,是的,我使用 tabyl 来显示输出
-
我的意思是,在函数外部的代码中,您将
prob传递为prob = c(0.7776, 0.1210),它来自tabyl输出。在函数内部,它只是传递列 'q1',而不是概率值
标签: r tidyverse case-when tidyeval