将变量与其年度四分位数值进行比较并创建排序变量
Compare variable to its yearly quartile values and create rankorder variable
我正在尝试找到一种快速的方法来执行以下操作:
- 确定数据库的年度四分位数值
- 将数据库中的特定变量与其年度四分位数值进行比较(匹配)
- 根据值,创建一个值为 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 的方法来解决这个问题。
欢迎提出任何建议!
西蒙
加入 'a' 的 'wide' 格式后,您可以使用 cut
为每个 '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
我正在尝试找到一种快速的方法来执行以下操作:
- 确定数据库的年度四分位数值
- 将数据库中的特定变量与其年度四分位数值进行比较(匹配)
- 根据值,创建一个值为 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 的方法来解决这个问题。
欢迎提出任何建议!
西蒙
加入 'a' 的 'wide' 格式后,您可以使用 cut
为每个 '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