r - 在 case_when 中制作 tidyeval 函数

标签 r tidyverse case-when tidyeval

我有一个数据集,我喜欢根据这些值的概率分布来估算其中一个值。让我们先做一些可重现的例子

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

我用过 mutatesample像这样在值 1 和 2 之间共享 value= 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

最佳答案

我们需要 probtabyl 生成的“百分比”列中的值,所以函数可以修改为

library(janitor)
library(dplyr)

my_impute <- function(.data, .prob_var, vals, ...) {
        .prob_var = enquo(.prob_var)
        .prob_vals <- .data %>%
             janitor::tabyl(!!.prob_var) %>%
             filter(!!.prob_var %in% vals) %>%
             pull(percent)

         .data %>%
              mutate(!! .prob_var := case_when(!! .prob_var == 5 ~ 
                sample(
                        2,
                        n(),
                        prob = .prob_vals,
                        replace = TRUE
                    ),
                    TRUE ~ as.integer(q1))
                    )
    }


df1 %>% 
     my_impute(q1, vals = 1:2) %>%
     tabyl(q1)
# q1    n percent
# 1 4285   0.857
# 2  715   0.143

关于r - 在 case_when 中制作 tidyeval 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418699/

相关文章:

r - 如何在 R 中的两个 H2OFrame 之间进行交叉连接?

r - 编写一个 R 函数来查找二进制子集

sql - SQL Server 中的 CASE 语句不支持 OR

r - 您能否根据 R 中的多个要求自动删除数据框中的数据行?

r - 使用 rvest 或 RSelenium 来抓取表

r - 使用 group_by tidyverse 自定义函数

r - 如何引用包含引用调用的表达式并取消引用其中的字符串?

r - 如何将参数传递给函数内的 dplyr 连接函数?

mysql - 如何使用case when计算mysql中的中位数

Mysql 查询没有给出 group by 的预期结果