R: Создание столбца с квартильным рангом для каждой даты в данных панели - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующие данные панели:

idNum        date                 salePrice
1           01.2018                  1
1           02.2018                  2
2           01.2018                  3
2           02.2018                  4
...            ...                    ...

Я хочу новый столбец, который показывает мне квартиль ранг для каждой даты, как это:

idNum        date                 salePrice quartilerank
1           01.2018                  1           1
1           02.2018                  2           1
2           01.2018                  3           2
2           02.2018                  4           2
...            ...                    ...

Работа с функцией:

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

Дает мне только квартиль, основанный на всех продажных ценах, и не различает даты.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Альтернатива с использованием data.table и findInterval

library(data.table)
setDT(df)[ ,.(idNum,salePrice,
               quartilerank=findInterval(salePrice,quantile(salePrice),all.inside = TRUE)),
              by=date]

#returns
     date idNum salePrice quartilerank
1: 1.2018     1         1            1
2: 1.2018     2         3            4
3: 2.2018     1         2            1
4: 2.2018     2         4            4
0 голосов
/ 06 сентября 2018

Если я хорошо понял, вам нужно вычислить квартиль внутри данных, поэтому, возможно, это поможет:

# some fake data
data <- data.frame(idNum=c(1,1,2,2,3,3,4,4),
                   date=c('01.2018','02.2018','01.2018','02.2018','01.2018','02.2018','01.2018','02.2018'),
                   salePrice=c(1,2,3,4,5,6,7,8))   

data
  idNum    date salePrice
1     1 01.2018         1
2     1 02.2018         2
3     2 01.2018         3
4     2 02.2018         4
5     3 01.2018         5
6     3 02.2018         6
7     4 01.2018         7
8     4 02.2018         8

# an empty list to populate     
qlist <- list()

# the loop that create the list with quartile for each date
for(k in data$date) {        
  subdata = subset(data, date == k)
  subdata$quartile = cut(subdata$salePrice,4,labels=F)
  qlist[[k]] <- subdata
}

# have it as a df
df <- do.call("rbind",qlist) 
df
          idNum    date salePrice quartile
01.2018.1     1 01.2018         1        1
01.2018.3     2 01.2018         3        2
01.2018.5     3 01.2018         5        3
01.2018.7     4 01.2018         7        4
02.2018.2     1 02.2018         2        1
02.2018.4     2 02.2018         4        2
02.2018.6     3 02.2018         6        3
02.2018.8     4 02.2018         8        4
...