【问题标题】:Why is this code working? [R] [dplyr] [mutate]为什么这段代码有效? [R] [dplyr] [变异]
【发布时间】:2020-11-13 17:58:43
【问题描述】:

我有一个数值变量 (FinalPerformance),它的取值范围为 0 到 100。我想根据该变量创建因子水平。因此,我使用函数 quantile 将数据集分为三个部分。我的问题是代码正确地对列进行了排序(我认为),但我不确定为什么。见下文:

Performance <- Performance %>% mutate(FactorPerformance = as.factor(case_when(
  
  FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] ~ "Low",
  FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[2]] ~ "Medium",
  TRUE ~ "High"
)), FactorPerformance = fct_relevel(FactorPerformance, c("Low", "Medium", "High")))

我认为“中”因子水平应该覆盖“低”因子水平,因为我没有指定介于范围之间。见下文:

Performance <- Performance %>% mutate(FactorPerformance = as.factor(case_when(
  
  FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] ~ "Low",
  FinalPerformance > quantile(FinalPerformance, probs = seq(0,1,1/3))[[1]] & 
    FinalPerformance <= quantile(FinalPerformance, probs = seq(0,1,1/3))[[2]] ~ "Medium",
  TRUE ~ "High"
)), FactorPerformance = fct_relevel(FactorPerformance, c("Low", "Medium", "High")))

当我计算 FactorPerformance 列中的值时,我得到了相同的结果。我错过了什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这真的归结为dplyr::case_when() 的工作方式:

    mutate()case_when() 应用于 data.frame 的每一行。对于每一行,它都会检查case_when() 调用中的条件语句。它从顶部开始寻找计算结果为TRUE 的条件。一旦找到波形符右侧的值,就会立即返回所有其他条件,解释器会转到下一行。

    关于您的代码:如果您希望将“中等”分类放在“低”之前,则必须在“低”条件之前列出“中等”条件。

    作为一般解释:下面是一个简化的示例。所有三个语句都是TRUE,但由于10 %in% 5:10 ~ "foo" 行位于另一个条件语句之前,因此返回“foo”。

    dplyr::case_when(
      10 %in% 5:10 ~ "foo",
      10 %in% 1:10 ~ "bar",
      TRUE ~ NA_character_
    )
    

    这里两个条件语句翻转过来,输出为“bar”。

    dplyr::case_when(
      10 %in% 1:10 ~ "bar",
      10 %in% 5:10 ~ "foo",
      TRUE ~ NA_character_
    )
    

    这也是为什么TRUE ~ NA_character_ 可以作为catch all 来处理前面任何语句未捕获的所有内容的原因。

    【讨论】:

    • 那么你的意思是,如果我已经为分位数设置了(x)我的代码,并且我首先指定了较低的分位数,那么我的代码不会有问题?
    • 不,arrange() 不影响输出。我澄清了我的答案并添加了代码示例。
    • 谢谢!我现在明白了。
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2023-04-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多