Проблема с фильтрацией внутри функции в R - PullRequest
0 голосов
/ 03 октября 2019

Я надеялся, что кто-нибудь может помочь мне с проблемой, которая у меня возникает при создании функции. Набор данных, который я использую, содержит ответы на опросы, с колонкой для каждого вопроса (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» (с кавычками вокруг него). Это приводит к тому, что строка фильтра (question_number == "Every day") не работает должным образом, так как ожидает имя столбца без "" (Q1 не "Q1").

Кто-нибудь может объяснить, почему это происходит, и потенциально предложить исправление? Я довольно плохо знаком с использованием R, поэтому я могу что-то упустить полностью.

Большое спасибо заранее: D

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Ссылка, предоставленная @ 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 - это столбец, в который вы хотите фильтровать.

Надеюсь, это поможет.

0 голосов
/ 03 октября 2019

В целом select и pull работают как с необработанными именами столбцов (Q1), так и с именами строковых столбцов ("Q1"), но filter, mutate, ... ожидают необработанные имена столбцов.

В предположении, что вас действительно интересует только число «Каждый день» в вашем вопросе, которое вы можете сделать с базой 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...