Подтвердить что ты не робот

Как создать столбец с рангом квартили?

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

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

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

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

Любые предложения?

4b9b3361

Ответ 1

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

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 и т.д., чтобы узнать больше об упомянутых здесь функциях...

Ответ 2

Подход, основанный на данных.

    library(data.table)
    tableOne <- setDT(tableOne)[, quartile := cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE, labels=FALSE)]

Ответ 3

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

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

Ответ 4

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

ntile(x, n)


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

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

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

Ответ 5

используя пакет 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

Ответ 6

Следующий код создает вектор группы ntile:

qgroup = function(numvec, n = 4){

    qtile = quantile(numvec, probs = seq(0, 1, 1/n))
    out = sapply(numvec, function(x) sum(x >= qtile[-(n+1)]))

    return(out)
}

Ответ 7

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

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))))