【问题标题】:Compare variable to its yearly quartile values and create rankorder variable将变量与其年度四分位数进行比较并创建排名变量
【发布时间】:2015-05-18 12:36:55
【问题描述】:

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

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

这是一个可重现的例子

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 之间,则值为 1
  • 如果dt$response[i] 在该特定年份的四分位值介于 0.50 和 0.75 之间,则值为 2
  • 否则值为 3

我确信某种循环会起作用,但必须有一种更像 R 的方式来解决这个问题。

欢迎提出任何建议!

西蒙

【问题讨论】:

  • 老实说,我真的不明白为什么人们对一般问题给予减分,尤其是当有可重复的例子时!欢迎任何解释......
  • 在新的开发版本中(我忘了提及),只需dcast 就足够了。您可以从github.com/Rdatatable/data.table/wiki/Installation 安装开发版

标签: r data.table quantile


【解决方案1】:

您可以使用cut 在加入'a' 的'wide' 格式后为每个'year' 创建rank 分组,即'a1' 和'dt'

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

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多