Как создать столбец с рангом квартили?
У меня есть таблица 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
... ... ... ...
Любые предложения?
Ответы
Ответ 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))))