«Аргумент не числовой c или логический: возвращает NA» ошибка при попытке использовать мою функцию. Может кто-нибудь помочь мне отладить это? - PullRequest
1 голос
/ 24 апреля 2020

В настоящее время у меня есть функция "get_col_mean", которая должна принимать в кадре данных и имени столбца, существующих в кадре данных, и принимать среднее значение в соответствующем столбце:

get_col_mean <- function(data_frame, column_name){
  return(mean(data_frame$column_name, na.rm = TRUE))
}

Однако, когда Я пытаюсь сделать это с моим фреймом данных "life_exp" и именем столбца "X1900":

test2 <- get_col_mean(life_exp, "X1900")
test3 <- get_col_mean(life_exp, X1900)
#(not sure which one of these is supposed to work; one of them should work, but as of now, neither work)

Я получаю сообщение об ошибке:

Warning message:
In mean.default(data_frame$column_name, na.rm = TRUE) :
  argument is not numeric or logical: returning NA

ОДНАКО, когда я набираю строку, Моя обратная строка внутри моей функции в изолированной строке выглядит следующим образом:

test1 <- mean(life_exp$X1900, na.rm = TRUE)

Она отлично работает, и я получаю среднее значение в столбце.

Кто-нибудь знаете, что не так с моей функцией? Я пытаюсь прикрепить изображение того, как выглядит life_exp data.frame, но я не могу найти никакого способа сделать это (впервые используя этот веб-сайт). В попытке объяснить это, все строки представляют страну, а все столбцы представляют год (X1900 - это 1900 год). Строка «Афганистан» + колонка «X1900» даст число, представляющее ожидаемую продолжительность жизни человека в Афганистане в 1900 году.

1 Ответ

0 голосов
/ 24 апреля 2020

Если мы хотим передать строку, используйте [[ вместо $

get_col_mean <- function(data_frame, column_name){
          mean(data_frame[[column_name]], na.rm = TRUE)
      }
get_col_mean(life_exp, "X1900")

, используя воспроизводимый пример

data(mtcars)
get_col_mean(mtcars, 'mpg')
#[1] 18.72

Для второго случая, т.е. передавая без кавычек имя столбца, мы можем использовать deparse(substitute

get_col_mean <- function(data_frame, column_name){
          mean(data_frame[[deparse(substitute(column_name))]], na.rm = TRUE)


      }

get_col_mean(life_exp, X1900)

Аналогично тому же воспроизводимому примеру

get_col_mean(mtcars, mpg)
#[1] 18.72

Проблема в том, что $ будет искать передачу литерального значения то есть 'column_name' вместо значения, переданного в нем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...