当前位置: 首页 > 知识库问答 >
问题:

动态case_when,允许不同数量的条件和条件本身

韦翰音
2023-03-14

我正在寻找一种动态的方法来指定一些“条件参数”,然后在操作时将其输入到一个case_(或者其他更适合该问题的方法)。

因此,我的目标是在调用时将条件的规范与case_分开,例如,用户可以在txt文件或R中的列表中键入条件,然后我会在调用时将该信息提供给case_(或任何其他函数,如果更合适的话)。

因此,假设下面的数据是我想要创建一个额外的变量来重新编码x,我可以这样做:

df <- data.frame(x = 1:10)

df |>
  mutate(x2 = case_when(x < 4 ~ 1,
                        x >= 4 & x <=7 ~ 2,
                        TRUE ~ 3))

现在,我想要实现的是,让这段代码更加灵活,我可以在外部指定case_when条件,然后重新编码。

例如,它可能看起来像:

all_conditions <- list(1 = "x < 2",
                       2 = "x >= 2 & x < 5",
                       3 = "x >= 5 & x < 9",
                       4 = "TRUE")

然后我可以做一些:

df |>
  mutate(x2 = do(case_when, all_conditions))

编辑:虽然示例显示了@Mael解决方案适用的数值类型变量,但该解决方案也适用于条件可能类似于“x==”abc“| x==”def”的字符变量。


共有1个答案

易祯
2023-03-14
匿名用户

下面是一个基于rlang的可能解决方案。

解释

>

  • 首先,当时,我们需要使用列表all_条件case_创建一个包含整个代码的字符串,这就是我的imap所做的。

    其次,使用rlang::parse_quo,我们将字符串转换为Mutate中使用的表达式。

    评论

    listall_conditions元素的名称必须用反括号括起来。

    library(tidyverse)
    library(rlang)
    
    df <- data.frame(x = 1:10)
    
    all_conditions <- list(`1` = "x < 2",
                           `2` = "x >= 2 & x < 5",
                           `3` = "x >= 5 & x < 9",
                           `4` = "TRUE")
    
    code <- imap(all_conditions, ~ str_c(.x, " ~ ", .y)) %>% 
              str_c(collapse = ", ") %>% str_c("case_when(",.,")")
    
    df %>% 
      mutate(x2 = !!parse_quo(code, env = caller_env()))
    
    #>     x x2
    #> 1   1  1
    #> 2   2  2
    #> 3   3  2
    #> 4   4  2
    #> 5   5  3
    #> 6   6  3
    #> 7   7  3
    #> 8   8  3
    #> 9   9  4
    #> 10 10  4
    

  •  类似资料:
    • 我想创建一个双变量映射,绘制两个变量:和。为了给部分数据提供正确的颜色,我想为一个变量添加一列颜色代码和另一个变量。然后再将两者连接起来。这样就可以像下面的示例那样对数据进行编码: 下面是我的示例df和失败代码: 有了这些结果...: 我是新的与mutate的结合,希望有人能帮助我。

    • 我有点卡住了。这个问题很接近我需要的,但不完全是: [Products_Final]是订单id上带有订单表的联接表 订单表是 诸如此类 所以如果我这样做了 我想要的是基于不同水果和国家组合的的总数,因为Product_id2看起来可能是重复的顺序。 如果我做了区分,总和似乎不起作用。 我如何把这两件事结合在一起?下面的我也试过了但是接不上

    • 大家好,我试着做一个方法来应用条件一个SelectQuery,但我不知道如何通过名称获得字段或通过名称获得表,代码示例... 但字段总是空的... 我怎么解决这个。

    • 数据文件:-已编辑- 我正在使用ANES 2016时间序列研究数据。使用以下代码和类别对缺失数据进行编码,以表明其缺失的原因: -1.不适用 -2.在单独文件或编码版本中提供的文本响应将包含在未来版本中 3.受限 4.错误 5.中断,足够的部分信息 6.没有选举后采访 7.没有帖子数据,由于信息不完整而删除 8.不知道 9.拒绝 我想在我的数据中使用case_when和Tidyverse对面的NA

    • 我有数据。看起来像这样的框架 首先,我想根据Day aka group_by(Day)对数据帧进行分组。当在每个组中,每种类型(tr1,tr2)的和(平均sd)大于控制(ctrl)的差(平均sd),然后我想在新列(new.col)中指定值~是,如果不是,我想指定值~否。 例如,我希望我的数据看起来像这样。它不一定要看起来像这样

    • 我有一个多列的数据表。这些列中的一列当前作为“键”工作(例如< code>keyb)。另一列(假设< code>A)中可能有数据,也可能没有数据。我想提供一个向量,每个键随机采样两行,-如果这个键出现在向量中,其中一行包含< code>A中的数据,而另一行不包含。 MRE: 例如,我可以将<code>数据子集。表基于<code>list_try 我最初的想法(也可能是低效的想法)是尝试链接每个键两