我正在使用R中的一个数据集,并且我想创建一个函数,该函数根据四分位数将值分为三个类别.第一个四分位数(Q1)以下的值应标记为"低表达",第三个四分位数(Q3)以上的值应标记为"高表达",其他所有值应标记为"NA".

我写了下面的函数,但它一直认为所有东西都是高表达的.有谁能帮我弄一下这个吗?

功能


library(tidyverse)


fun_1 <- 功能(df, var_1) {
  
  quants <- quantile(df[[var_1]], c(.25, .75))
  
  tmp_1 <- df %>%
    # selecting var_1
    select({{var_1}}) %>%
    # creating a new variable classifying Q1 and Q4
    mutate(
      expression =
        case_when(
          {{var_1}} >= quants[["75%"]] ~ sprintf(
            "High expression ( >= %.02f )", quants[["75%"]]),
          {{var_1}} <= quants[["25%"]] ~ sprintf(
            "Low expression ( <= %.02f )", quants[["25%"]]),
          .default = NA)) %>%
    # excluding Q2 and Q3
    filter(!is.na(expression))
          
  tmp_1
}

fun_1(iris, "Sepal.Length")

运行代码后,我得到以下输出:函数的输出:

output of the 功能 with Iris dataset

但是,我希望该函数删除第一个四分位数(Q1)和第三个四分位数(Q3)之间的值,包括低表达式值(低于Q1)和高表达式值(高于Q4).

推荐答案

我认为{{var_1}}在那里没有像预期的那样工作.解决这个问题的一种方法是将var_1转换为符号并使用Rlang的!!引用.

fun_2 <- function(df, var_1) {
  library(dplyr)
  sym <- as.symbol(var_1)
  quants <- quantile(df[[var_1]], c(0.25, 0.75), names = FALSE)
  df %>% 
    select(!!sym) %>%
    mutate(expression = case_when(
      !!sym < quants[1] ~ sprintf("Low expression ( < %.02f )", quants[1]),
      !!sym >= quants[2] ~ sprintf("High expression ( >= %.02f )", quants[2]),
      .default = "NA")
    ) %>%
    filter(expression != "NA")
}
fun_2(iris, "Sepal.Length")
#    Sepal.Length                  expression
# 1           4.9   Low expression ( < 5.10 )
# 2           4.7   Low expression ( < 5.10 )
# 3           4.6   Low expression ( < 5.10 )
# 4           5.0   Low expression ( < 5.10 )
# 5           4.6   Low expression ( < 5.10 )
# 6           5.0   Low expression ( < 5.10 )
# 7           4.4   Low expression ( < 5.10 )
# 8           4.9   Low expression ( < 5.10 )
# 9           4.8   Low expression ( < 5.10 )
# 10          4.8   Low expression ( < 5.10 )
# 11          4.3   Low expression ( < 5.10 )
# 12          4.6   Low expression ( < 5.10 )
# 13          4.8   Low expression ( < 5.10 )
# 14          5.0   Low expression ( < 5.10 )
# 15          5.0   Low expression ( < 5.10 )
# 16          4.7   Low expression ( < 5.10 )
# 17          4.8   Low expression ( < 5.10 )
# 18          4.9   Low expression ( < 5.10 )
# 19          5.0   Low expression ( < 5.10 )
# 20          4.9   Low expression ( < 5.10 )
# 21          4.4   Low expression ( < 5.10 )
# 22          5.0   Low expression ( < 5.10 )
# 23          4.5   Low expression ( < 5.10 )
# 24          4.4   Low expression ( < 5.10 )
# 25          5.0   Low expression ( < 5.10 )
# 26          4.8   Low expression ( < 5.10 )
# 27          4.6   Low expression ( < 5.10 )
# 28          5.0   Low expression ( < 5.10 )
# 29          7.0 High expression ( >= 6.40 )
# 30          6.4 High expression ( >= 6.40 )
# 31          6.9 High expression ( >= 6.40 )
# 32          6.5 High expression ( >= 6.40 )
# 33          4.9   Low expression ( < 5.10 )
# 34          6.6 High expression ( >= 6.40 )
# 35          5.0   Low expression ( < 5.10 )
# 36          6.7 High expression ( >= 6.40 )
# 37          6.4 High expression ( >= 6.40 )
# 38          6.6 High expression ( >= 6.40 )
# 39          6.8 High expression ( >= 6.40 )
# 40          6.7 High expression ( >= 6.40 )
# 41          6.7 High expression ( >= 6.40 )
# 42          5.0   Low expression ( < 5.10 )
# 43          7.1 High expression ( >= 6.40 )
# 44          6.5 High expression ( >= 6.40 )
# 45          7.6 High expression ( >= 6.40 )
# 46          4.9   Low expression ( < 5.10 )
# 47          7.3 High expression ( >= 6.40 )
# 48          6.7 High expression ( >= 6.40 )
# 49          7.2 High expression ( >= 6.40 )
# 50          6.5 High expression ( >= 6.40 )
# 51          6.4 High expression ( >= 6.40 )
# 52          6.8 High expression ( >= 6.40 )
# 53          6.4 High expression ( >= 6.40 )
# 54          6.5 High expression ( >= 6.40 )
# 55          7.7 High expression ( >= 6.40 )
# 56          7.7 High expression ( >= 6.40 )
# 57          6.9 High expression ( >= 6.40 )
# 58          7.7 High expression ( >= 6.40 )
# 59          6.7 High expression ( >= 6.40 )
# 60          7.2 High expression ( >= 6.40 )
# 61          6.4 High expression ( >= 6.40 )
# 62          7.2 High expression ( >= 6.40 )
# 63          7.4 High expression ( >= 6.40 )
# 64          7.9 High expression ( >= 6.40 )
# 65          6.4 High expression ( >= 6.40 )
# 66          7.7 High expression ( >= 6.40 )
# 67          6.4 High expression ( >= 6.40 )
# 68          6.9 High expression ( >= 6.40 )
# 69          6.7 High expression ( >= 6.40 )
# 70          6.9 High expression ( >= 6.40 )
# 71          6.8 High expression ( >= 6.40 )
# 72          6.7 High expression ( >= 6.40 )
# 73          6.7 High expression ( >= 6.40 )
# 74          6.5 High expression ( >= 6.40 )

如果您阅读了一些dplyr的"编程"文档,有些文档试图通过消除符号名称两边的引号来使这一点更方便(对于用户).虽然我建议添加这个非标准判断(NSE)看起来很好,但它有时会使故障排除变得更加困难,特别是对于新的R用户/程序员.但如果你真的想要它,你可以这样做,以获得同样的结果:

fun_3 <- function(df, var_1) {
  library(dplyr)
  sym <- rlang::enquo(var_1)
  quants <- quantile(pull(df, !!sym), c(0.25, 0.75), names = FALSE)
  df %>% select(!!sym) %>%
    mutate(expression = case_when(
      !!sym < quants[1] ~ sprintf("Low expression ( < %.02f )", quants[1]),
      !!sym >= quants[2] ~ sprintf("High expression ( >= %.02f )", quants[2]),
      .default = "NA")
    ) %>%
    filter(expression != "NA")
}
fun_3(iris, Sepal.Length) # notice no quotes needed

R相关问答推荐

在边界外添加注释或标题

计算R中的威布尔分布的EDF

使用tidyverse / Mutate的存款账户余额

使用R中相同值创建分组观测指标

单个轮廓重叠条的单独图例

展开对数比例绘图的轴(添加填充)

Ggplot2中geom_tile的动态zoom

如何将网站图像添加到带有极坐标的面包裹条形图?

TreeNode打印 twig 并为其上色

如何使用同比折线图中的个别日

停止ggplot将多行减少到一行

Geom_arcbar()中出错:找不到函数";geom_arcbar";

如何在反曲线图中更改X标签

我如何使用循环来编写冗余的Rmarkdown脚本?

R中的Desolve:返回的导数数错误

如何在矩阵图中按标准对数据进行分组以绘制矩阵

R:水平旋转图

在分面的ggplot2条形图中对条形图进行排序,并省略每组未使用的系数级别

如何在GGPlot中控制多个图例和线型

如何在基数R中根据矩阵散点图中的因子给数据上色?