2015-03-16 5 views
-1

Я пытаюсь найти быстрый способ сделать следующее:Сравните переменный с его годовыми значениями квартили и создать rankorder переменной

  1. Определить годовые значения квартили базы данных
  2. Сравнить (матч) конкретного переменная в базе данных ее годовой стоимости квартиль
  3. в зависимости от значения, создать новую переменную со значением 0,1,2,3 ... (rankorder)

Вот воспроизводимый пример

library(data.table) 
dt <- data.table(rep(seq.int(2000,2010,1),30), runif(330,0,5)) 
colnames(dt) <- c("year","response") # Ignore warning 

    quarts <- function(x) { 
    quantile(x, probs = seq(0.25,0.75,0.25),na.rm=T, names=T) 
} 
setkey(dt, year) 
a <- data.table(dt[,quarts(response), by = key(dt)]) 

Теперь data.table a содержит необходимые значения квартиль dt$response за каждый год. Что мне нужно сделать сейчас, чтобы сравнить значение dt$response со значениями квартили в a и создать новую переменная dt$quartresponse, которая принимает

  • Значение 0, если dt$response[i] меньше значений 0,25 квартили для этого конкретного
  • года
  • значение 1, если dt$response[i] находится между значением 0,25 и 0,5 квартили для этого конкретного года
  • значение 2, если dt$response[i] находится между значением 0,50 и 0,75 квартили для этого конкретного года
  • Value 3 в противном случае

Я уверен, что какой-то цикл будет работать, но должен быть более R-образный способ решения этого.

Любые предложения приветствуются!

Simon

+0

Я честно не понимаю, почему люди дают минус очки на вопросы вообще и особенно не в том случае, когда есть воспроизводимый пример! Любые объяснения будут приветствоваться ... – SJDS

+0

В новой версии devel (о которой я забыл упомянуть) достаточно просто «dcast». Вы можете установить версию devel из https://github.com/Rdatatable/data.table/wiki/Installation – akrun

ответ

2

Вы можете использовать cut создать rank группировки для каждого «год» после вступления в «широкий» формат «а» то есть «a1» с «дт»

library(data.table) #data.table_1.9.5 
a1 <- dcast(a[, ind:=paste0('Quart',1:3)], year~ind, value.var='V1') 
res <- setkey(a1, year)[dt][, quartresponse:=cut(response, 
      breaks=c(-Inf,Quart1[1L], Quart2[1L], Quart3[1L],Inf), 
         labels=FALSE)-1, by=year][, 2:4 := NULL] 

head(res,5) 
# year response quartresponse 
#1: 2000 4.959491    3 
#2: 2000 2.522881    2 
#3: 2000 4.465005    3 
#4: 2000 0.5421316   0 
#5: 2000 2.2328381   1 

head(a1,3) 
# year Quart1 Quart2 Quart3 
#1: 2000 1.703482 2.325766 3.867453 
#2: 2001 1.395815 1.972565 3.286358 
#3: 2002 1.469664 2.151403 3.359189