R中函数内的筛选问题

R中函数内的筛选问题,r,function,filter,dplyr,R,Function,Filter,Dplyr,我希望有人能帮我解决一个问题,我正在创建一个函数。我使用的数据集包含调查回复,每个问题Q1、Q2等都有一列,每行都有回复。函数必须能够选择列Q1、Q2等,然后从该列中筛选一个特定响应,以便对其进行计数 我正在尝试编写一个函数,允许您将要选择作为参数之一的问题编号包括在内。代码如下: my_function <- function(survey, question_number) { selected_question <- survey %>% select(que

我希望有人能帮我解决一个问题,我正在创建一个函数。我使用的数据集包含调查回复,每个问题Q1、Q2等都有一列,每行都有回复。函数必须能够选择列Q1、Q2等,然后从该列中筛选一个特定响应,以便对其进行计数

我正在尝试编写一个函数,允许您将要选择作为参数之一的问题编号包括在内。代码如下:

my_function <- function(survey, question_number) {
  selected_question <- survey %>%
    select(question_number)
  everyday_responses <- selected_question %>%
    filter(question_number == "Every day") %>%
    count()
这适用于选择列,但不适用于在该列中进行过滤。我已经计算出这是因为我必须将疑问号参数输入为Q1,并在其周围加上引号。这会导致filterquestion_number==每日行无法正常工作,因为这需要没有Q1而不是Q1的列名

有人能解释为什么会发生这种情况,并提出解决方案吗?我对使用R是相当陌生的,所以我可能完全遗漏了一些东西

非常感谢:D

通常,选择并拉取原始列名Q1和字符串列名Q1,但过滤、变异。。。需要原始列名

假设您只对问题中每天的数量感兴趣,您可以使用base R:

my_function_base <- function(survey, question_number) {

  sum(survey[[question_number]] %in% "Every day")

}

my_function_base(my_df, "Q2")
# [1] 1
使用字符串输入

资料


@zx8754共享的链接应该能够帮助您解决问题。考虑到你说你是R新手,这里是你如何修改你的函数的

我的_函数% 选择列%>% 滤器as.symbolcol==每天%>% 计数 } 这就是调用函数的方式 我的_函数df,Q1 在数据框中,我认为它称为survey,col是要过滤到的列


希望有帮助

非常感谢你这么快回复我!即使在使用数据运行第一个选项时,也会收到错误消息error:.vars\u谓词必须是对所有\u变量或任何\u变量的调用,而不是对公式的调用。我认为这与filter_at的语法有关,但无法解释为什么会发生这种情况。你知道为什么这对我不起作用吗?嗯,你知道我的例子或你的例子有错误吗?您正在使用哪个版本?您应该能够通过指定过滤器编号、所有变量来解决此问题。==每天都是这样!再次感谢您的帮助:相关,可能重复
library(dplyr)
my_function_str <- function(survey, question_number) {

  survey %>%
    filter_at(question_number, ~ . == "Every day") %>%
    count()
}

my_function_str(my_df, "Q2")
# A tibble: 1 x 1
#       n
#   <int>
# 1     1
my_function_nse <- function(survey, question_number) {
  question_number <- enquo(question_number)

  survey %>%
    filter(!!question_number == "Every day") %>%
    count()
}

my_function_nse(my_df, Q1) # No quotes around Q1

# A tibble: 1 x 1
#       n
#   <int>
# 1     2
my_df <- data.frame(Q1 = c("Every week", "Every day", "Every week", "Every day"), 
                    Q2 = c("Every week", "Every week", "Every week", "Every day"))