25-й квантиль для каждого столбца кадра данных в R - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь перебрать кадр данных в R. Для каждого столбца я хочу напечатать 25-й квантиль.

Используя данные из пакета nycflights13, я пытаюсь сделать следующее:

abt <- select(flights, sched_dep_time)

for(i in names(abt)) {
  qrt_1 <- quantile(abt[i], c(.25))
  print(qrt_1)
}

Однако это дает мне ошибку: Ошибка: Must use a vector in [, not an object of class matrix.

Где я здесь делаю неправильный поворот?

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

В вашем примере вы используете select для выбора одного столбца из фрейма данных «полеты», который возвращает tibble с одним столбцом, указывающим запланированное время вылета. Вы не перебираете фрейм данных.

Если вы хотите выполнить итерации по фрейму данных о полетах, вам нужно сделать что-то вроде этого:

cat("25th Quantiles:\n===============\n")

for(i in names(flights)) 
{ 
  if(is.numeric(flights[[i]])) 
  {
    qrt_1 <- quantile(flights[[i]], c(.25), na.rm = TRUE)
    cat(i, ":", qrt_1, "\n")
  }
}

, который выводит на консоль следующее:

#> 25th Quantiles:
#> ===============
#> year : 2013 
#> month : 4 
#> day : 8 
#> dep_time : 907 
#> sched_dep_time : 906 
#> dep_delay : -5 
#> arr_time : 1104 
#> sched_arr_time : 1124 
#> arr_delay : -17 
#> flight : 553 
#> air_time : 82 
#> distance : 502 
#> hour : 9 
#> minute : 8 
2 голосов
/ 02 марта 2020

Это может не дать вам решения вашего вопроса, почему оно не работает, но я хочу представить вам альтернативу с lapply()

lapply(mtcars, function (x) quantile(x, 0.25))

Это также возвращает вам 25% квантиль каждого столбец в вашем фрейме данных. Но каждый столбец должен иметь номер c (который вы предполагаете в своем примере).

Также вы можете использовать sapply вместо lapply, если вы хотите векторизованный вывод

1 голос
/ 02 марта 2020

Вы можете передать с помощью dplyr summarise_if (комментарий @ emilliman5):

library(tidyverse)

flights %>% 
  summarise_if(is.numeric, quantile, 0.25) 

Поскольку вы не предоставили никакого воспроизводимого примера, вы можете проверить с помощью iris data:


используя summarise_if

iris %>% 
   summarise_if(is.numeric, quantile, 0.25)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1          5.1         2.8          1.6         0.3     

или используя sapply и select_if (оригинальный ответ):

iris %>% 
  select_if(is.numeric) %>% 
  sapply(quantile, 0.25)

#Sepal.Length.25%  Sepal.Width.25% Petal.Length.25%  Petal.Width.25% 
#             5.1              2.8              1.6              0.3 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...