R中的函数内过滤问题

时间:2019-10-03 09:41:00

标签: r function filter dplyr

我希望有人可以帮助我解决创建函数的问题。我正在使用的数据集包含调查答复,每个问题(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()

这适用于选择列,但不适用于该列中的过滤。我已经知道这是因为我必须将question_number参数输入为“ Q1”(在其周围加上引号)。这导致filter(question_number ==“ Everyday”)行无法正常运行,因为这期望没有“”(Q1而不是“ Q1”)的列名。

有人可以解释为什么会发生这种情况并可能提出解决方案吗?我对使用R很陌生,所以我可能会完全缺少一些东西。

非常感谢:D

2 个答案:

答案 0 :(得分:0)

通常,selectpull可以同时使用原始列名称(Q1)和字符串列名称(“ Q1”),但是filtermutate,.. 。期望原始列名。

假设您真的只对问题中“每天”的数量感兴趣,那么您可以对基数R进行操作:

my_function_base <- function(survey, question_number) {

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

}

my_function_base(my_df, "Q2")
# [1] 1

有几种方法可以修复dplyr函数,但这是两个选项。

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

filter_at使用字符串作为输入,然后在指定的列进行过滤。

使用NSE:另请参见:https://dplyr.tidyverse.org/articles/programming.html

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"))

答案 1 :(得分:0)

@ zx8754共享的链接应该可以帮助您解决问题。考虑到您说自己是R的新手,因此可以修改函数。

my_function <- function(df, col) {
  df %>%
    select(col) %>%
    filter((!!as.symbol(col))=="Every day") %>%
    count()
}
# This is how you call your function
my_function(df, "Q1")

df您的数据帧中,我认为它称为survey,而col是您要过滤到的列。

希望有帮助。