Напишите базовую c функцию в R, чтобы получить интерквартиль (Q3-Q1) - PullRequest
0 голосов
/ 28 мая 2020

У меня вопрос по коду. Вопрос показан ниже.

Напишите базовую c функцию (назовите ее getIQR), которая принимает вектор чисел и возвращает межквартильный диапазон (75-й процентиль - 25-й процентиль). Вы можете использовать функцию квантиля. Удалите имя в возвращаемом векторе (т.е. убедитесь, что у возвращаемого элемента нет имени вроде 75% или чего-то подобного). Разрешите вашей функции передавать безымянные аргументы в функцию квантиля.

Попросите вашу функцию проверить, является ли переданное значение numeri c и подходит ли оно для этого аргумента (т. Е. Вектор или фрейм данных / тиббл только с одним столбцом - не допускайте матриц) - если нет, остановите функцию и верните соответствующее сообщение.

Примечание: попытка работать с фреймами данных / таблицами одного измерения была для меня немного сложной . Сначала я проверил, был ли это фрейм данных, если да, то проверил, есть ли в нем только один столбец. Если оба они верны, я преобразовал этот столбец в вектор (используя [[или pull). Затем я проверил, не было ли значение numeri c или вектором.

Вот мой частичный код, и я не знаю, почему он не работает.

# Write the function
getIQR <- function(vec){
  if(!is.data.frame(vec)){
    stop("This function first requires a data.frame.")
  }
  if(ncol(vec) != 1){
   stop("This function requires only one column.") 
  }
  if(is.data.frame(vec) && ncol(vec) == 1){
    as.numeric(t(vec))
  }
  if(!is.numeric(vec)){
    stop("This function only works for a numeric")
  }

  Q3 <- quantile(vec, .75)
  Q1 <- quantile(vec, .25)
  IQR <- Q3 - Q1
  IQR
}

vec <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
getIQR(vec)

Он всегда говорит, что «Эта функция сначала требует data.frame». Что еще я должен ввести в соответствии с примечанием?

Большое спасибо за вашу помощь.

1 Ответ

2 голосов
/ 28 мая 2020

Следующий код

if(!is.data.frame(vec)){
  stop("This function first requires a data.frame.")
}

предназначен для вывода сообщения об ошибке, если вы не предоставили объект типа data.frame для своей функции. Это проверка типа ввода.

Предоставляемый вами объект:

vec <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

- это не data.frame, а числовой c вектор. Поэтому вы получаете ошибку.

Итак, либо вы решите, что ваша функция ожидает, что vec будет вектором, в этом случае удалите предложения if и, возможно, добавьте

if(!is.numeric(vec)){
    stop("Input is not a numeric vector")
}

, чтобы проверить это. Или вы или вы предоставляете data.frame своей функции

vec <- data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

Однако тогда вам нужно исправить еще одну ошибку в вашей функции: вы забыли присвоить результат

as.numeric(t(vec))

в любую переменную (используя <-), поэтому этот код не может иметь никакого эффекта

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