将变量与其年度四分位值进行比较并创建rankorder变量

时间:2015-03-16 11:52:43

标签: r data.table quantile

我正在努力找到一种快速的方法来执行以下操作:

  1. 确定数据库的年度四分位数值
  2. 将数据库中的特定变量与其年度四分位值进行比较(匹配)
  3. 根据值,创建一个值为0,1,2,3 ...(rankorder)
  4. 的新变量

    这是一个可重现的例子

    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

    • 如果dt$response[i]小于该特定年份的0.25四分位数值,则为0
    • 如果dt$response[i]介于特定年份的0.25到0.5四分位数值之间,则为值
    • 如果dt$response[i]介于该特定年份的0.50和0.75四分位数值之间,则为值
    • 值3否则

    我确定某种循环可行,但必须有一种更像R的解决方法。

    欢迎任何建议!

    西蒙

1 个答案:

答案 0 :(得分:2)

在加入“广泛”格式的'a',即'a1'与'dt'

后,您可以使用cut为每个'年'创建rank分组
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