Хорошо, я новичок в stackoverflow и R. Это, вероятно, довольно глупая проблема, но я нигде не мог найти решения.

Пакеты

library(tidyverse)

Вот код

sample_size_finder <-  function(variable, value){
  df %>% 
    select(variable) %>%
    filter(variable == value) %>%
    count()
}
  • df = фрейм данных, который я импортировал ранее
  • переменная = имя столбца, который я хочу выбрать и отфильтровать
  • значение = значение в этом столбце, которое я хочу отфильтровать

Я хочу, чтобы функция выполняла поиск столбца в моем фрейме данных, заданном аргументом "переменная" , выбирала его и отфильтровывала из него все наблюдения, которые равны значению аргумента . Затем подсчитайте () все эти наблюдения.

Когда я пытаюсь запустить функцию

sample_size_finder("team_size", 4)

Он возвращается

  n
1 0

Что равно нулю и, следовательно, неверный результат.

Запуск кода внутри без функции, обернутой вокруг него с теми же аргументами

df %>%
    select(team_size) %>%
    filter(team_size == 4) %>%
    count()

Возвращается

   n
1 12

Что является правильным выводом (12 наблюдений для team_size, равного 4).

Я сузил проблему до аргумента переменной в моей функции sample_size_finder (переменная, значение). Вот что я пробовал до сих пор:

  • изменил функцию, чтобы в качестве аргумента использовалось только "значение". Это дает желаемый результат, но я хочу, чтобы был включен аргумент "переменная"
  • изменил функцию, чтобы в качестве аргумента использовалась только «переменная». Это вернуло "0" как результат
  • запустил функцию, не заключая «переменную» в строковые кавычки. Это вернуло "0" как результат

Я почти готов сдаться и просто использовать код без функции, но почему-то меня это сильно беспокоит. Буду очень признателен, если добрая душа мне поможет :)

Всего наилучшего, Матиас

0
Matthias 9 Окт 2021 в 03:03

2 ответа

Лучший ответ

Используйте .data для доступа к именам столбцов как имени переменной в функции.

library(dplyr)

sample_size_finder <-  function(variable, value){
  df %>% 
    select(.data[[variable]]) %>%
    filter(.data[[variable]] == value) %>%
    count()
}

sample_size_finder("team_size", 4)

Это можно записать в базе R как -

sample_size_finder <-  function(variable, value){
  sum(df[[variable]] == value)
}
0
Ronak Shah 9 Окт 2021 в 02:41

Мы можем использовать across с all_of

library(dplyr)
sample_size_finder <-  function(variable, value){
  df %>% 
    select(all_of(variable)) %>%
    filter(across(all_of(variable), ~ . == value)) %>%
    count()
}

sample_size_finder("team_size", 4)
0
akrun 9 Окт 2021 в 17:21