Как создать столбец с квартильным рангом? - PullRequest
25 голосов
/ 22 сентября 2011

У меня есть таблица с именем tableOne в R, как это:

idNum        binaryVariable        salePrice
2               1                    55.56
4               0                    88.33
15              0                     4.45
87              1                    35.77
...            ...                    ...

Я бы хотел взять значения, полученные из: summary (tableOne $ salePrice), чтобы создать четыре квартиля по salePrice. Затем я хотел бы создать столбец tableOne $ квартиль, с которым квартиль находится в каждой строке salePrice. Это будет выглядеть так:

idNum        binaryVariable            salePrice      quartile
    2               1                    55.56            3
    4               0                    88.33            4
    15              0                     4.45            1
    87              1                    35.77            2 
    ...            ...                    ...            ...  

Есть предложения?

Ответы [ 6 ]

49 голосов
/ 22 сентября 2011

Это должно сделать это:

tableOne <- within(tableOne, quartile <- as.integer(cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE)))

... Некоторые детали:

Функция within отлично подходит для вычисления новых столбцов. Вы не должны ссылаться на столбцы как tableOne$salesPrice и т. Д.

tableOne <- within(tableOne, quartile <- <<<some expression>>>)

Функция quantile вычисляет квантили (или, в вашем случае, квартили). 0:4/4 оценивается как c(0, 0.25, 0.50, 0.75, 1).

Наконец, функция cut разделяет ваши данные на эти квартили. Но вы получаете factor со странными именами, поэтому as.integer превращает его в группы 1,2,3,4.

Попробуйте ?within и т. Д., Чтобы узнать больше о функциях, упомянутых здесь ...

7 голосов
/ 24 ноября 2015

Data.table подход

    library(data.table)
    tableOne <- setDT(tableOne)[, quartile := cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE, labels=FALSE)]
3 голосов
/ 29 августа 2014

Установка параметра labels=FALSE в cut() возвращает имена категорий в виде целых чисел. Смотри ?cut

tableOne <- within(tableOne, quartile <- cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE, labels=FALSE))
0 голосов
/ 04 февраля 2019

С помощью dplyr вы можете использовать функцию ntile:

ntile(x, n)


tableOne$quartile <- ntile(tableOne$salesPrice, 4)

Это добавит в таблицу столбец, назначающий квантиль по n для каждой строки с указанным ценовым квантилем.

Примечание. Этот метод начинается с более низких значений 1 и оттуда вверх.

0 голосов
/ 17 октября 2018

используя пакет cutr мы можем сделать:

# devtools::install_github("moodymudskipper/cutr")
library(cutr)
df$quartile <- smart_cut(df$salePrice, 4, "g", output = "numeric")
#   idNum binaryVariable salePrice quartile
# 1     2              1     55.56        3
# 2     4              0     88.33        4
# 3    15              0      4.45        1
# 4    87              1     35.77        2
0 голосов
/ 20 июля 2016

Вы можете использовать следующий скрипт

tableOne$Quartile<-ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.25)),1,
                           ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.5)),2,
                                  ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.75)),3,
                                         ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(1)),4,NA))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...