【问题标题】:How to create a function with "not equal to"?如何创建一个“不等于”的函数?
【发布时间】:2020-09-11 15:06:21
【问题描述】:

我尝试使用filter != 创建一个函数,但它不起作用。不知道是不是和tidy评估有关。

这是我尝试过的:

library(haven)
library(dplyr)
library(labelled)
library(sjlabelled)

data <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")
data$Q01_L <- as_label(data$Q01)

这是我尝试编写的函数:

    bar_plot <- function(data, var) {
      var <- rlang::ensym(var)
      
      data %>% 
        filter(!var == "Neither") %>% 
        ggplot(aes(!!var)) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(data$var)) 
    }
    
    
    bar_plot(data, Q01_L)

我想要实现的是删除“Neither”值,我使用filter(!var == "Neither") 尝试了这个,但这不起作用,我仍然绘制“Neither”。我也失去了图表的标题。

这就是我想要实现的目标:

我可以用几行代码做到这一点:

data %>% 
  filter(!Q01_L == "Neither") %>% 
  ggplot(aes(Q01_L)) +
  geom_bar() +
  coord_flip() +
  theme_classic() +
  labs(x = "Question", y = "Count", title = var_label(data$Q01_L)) 

但我不知道如何将其转换为函数。

【问题讨论】:

标签: r ggplot2 dplyr nse


【解决方案1】:

尝试将eval 用作filter(!eval(var) == "Neither")

 bar_plot <- function(.data, var) {
    var <- rlang::ensym(var)
    
    data %>% 
        filter(!eval(var) == "Neither") %>% 
        ggplot(aes(!!var)) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(data[var])) 
}


bar_plot(data, Q01_L)

【讨论】:

    【解决方案2】:

    你可以在函数中使用curly-curly操作符,这样var &lt;- rlang::ensym(var)就可以被移除了。

    来自help("nse-force")

    curly-curly 运算符 {{ }} 用于函数参数有点特殊,因为它强制函数参数并立即将其分解。解析后的表达式被替换,准备在另一个上下文中进行评估,例如数据框。

    bar_plot <- function(data, var) {
      
      data %>% 
        filter({{var}} != "Neither") %>% 
        ggplot(aes( {{var}} )) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(pull(data, {{var}})))
    }
    
    bar_plot(data, Q01_L)
    

    【讨论】:

    • 请注意,仍然有一个非常微妙的错误来自 OP 的代码:参数名称是 .data,而不是 data
    • 我认为你的答案是新的tidyverse 方法的最佳答案
    • @starja 一开始就发现了,但是写答案的时候忘记修正了!感谢您的提醒!
    • btw.: 在tidyverse 中,可以与管道一起使用的函数的data 参数通常命名为.data,所以我认为保留这个名称是有意义的跨度>
    【解决方案3】:

    您也可以使用!!(感谢@DarrenTsai)和!=

    #Plot
    bar_plot <- function(.data, var) {
      var <- rlang::ensym(var)
      
      data %>% 
        filter(!!var != "Neither") %>% 
        ggplot(aes(!!var)) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(data[,var])) 
    }
    
    
    bar_plot(data, Q01_L)
    

    输出:

    【讨论】:

    • 不需要sym()filter(!!var != "Neither") 没问题。
    • @DarrenTsai 是的,它也可以这样工作,谢谢!我会用你的信息更新答案!!!
    • 过滤器效果很好。但是当我使用 data[,var] 时出现此错误:Error in .subset(x, j) : invalid subscript type 'symbol'
    • @TyperWriter 试试改成这个title = var_label(data[[var]])。看起来该变量可能丢失了,但正如您在数据中看到的那样,该图是根据需要生成的。也可能是labelled 包版本。我有最后一个版本。
    • @TyperWriter 我有labelled_2.6.0
    猜你喜欢
    • 2011-04-06
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多