R:如何使用时变断点有效地分箱?
R: How to bin efficiently using time-varying breakpoints?
我正在处理一个包含 1400 万行的大型数据框,其中包含列 month
、firmID
和 firmSize
。在一个单独的数据框中,我有公司规模的月度断点(基本上是五分位数)。
我的目标是向第一个数据框添加第四列 quintile
。在此专栏中,我将有一个从 1 到 5 的数字,对应于 firmSize
在该特定月份所属的大小五分位数。
我有以下循环来完成这项工作,但运行时间为数百小时。
for (i in 1:length(df$month)) {
for (j in 1:4) {
if (df$size[i] <= breakpoints[which(df$month[i] == breakpoints$month),(j+1)]) {
df$quintile[i] <- j
break()
}
else {
df$quintile[i] <- 5
}
}
}
例如,我的知识非常有限。 dplyr 的应用程序,我想知道是否有人知道如何解决这个问题,这样我就不必把我的笔记本电脑 运行 放几个星期了。
提前致谢!
编辑: 数据框的示例数据:(感谢 Ricardo 的建议!)
df
month firmID firmSize
201001 46603210 9738635
201001 72913210 1166077
201001 00621210 3884422
201512 75991610 2932127
201512 45383610 1241272
201512 05766520 1931038
断点
month Q1 Q2 Q3 Q4 Q5
201001 322770 1038300 2112300 4597580 28919700
201512 379340 1239800 2840630 7785700 46209140
我想知道使用 findInterval
和 data.table
是否值得追求并且速度更快。这是改编自 this answer 我认为很有帮助。
findInterval
找到一个向量在另一个向量中的索引(假设另一个是非递减的)。在这种情况下,从 Q1
到 Q5
的 breakpoints
列形成第二个向量,函数将 return 基于第一个中的 firmSize
值的索引数据框。
library(data.table)
setDT(df)
setkey(df, month)
setDT(breakpoints)
setkey(breakpoints, month)
df[, quintile := findInterval(firmSize, breakpoints[.BY][, Q1:Q5]) + 1, by = month][]
输出
month firmID firmSize quintile
1: 201001 46603210 9738635 5
2: 201001 72913210 1166077 3
3: 201001 621210 3884422 4
4: 201512 75991610 2932127 4
5: 201512 45383610 1241272 3
6: 201512 5766520 1931038 3
我正在处理一个包含 1400 万行的大型数据框,其中包含列 month
、firmID
和 firmSize
。在一个单独的数据框中,我有公司规模的月度断点(基本上是五分位数)。
我的目标是向第一个数据框添加第四列 quintile
。在此专栏中,我将有一个从 1 到 5 的数字,对应于 firmSize
在该特定月份所属的大小五分位数。
我有以下循环来完成这项工作,但运行时间为数百小时。
for (i in 1:length(df$month)) {
for (j in 1:4) {
if (df$size[i] <= breakpoints[which(df$month[i] == breakpoints$month),(j+1)]) {
df$quintile[i] <- j
break()
}
else {
df$quintile[i] <- 5
}
}
}
例如,我的知识非常有限。 dplyr 的应用程序,我想知道是否有人知道如何解决这个问题,这样我就不必把我的笔记本电脑 运行 放几个星期了。
提前致谢!
编辑: 数据框的示例数据:(感谢 Ricardo 的建议!)
df
month firmID firmSize
201001 46603210 9738635
201001 72913210 1166077
201001 00621210 3884422
201512 75991610 2932127
201512 45383610 1241272
201512 05766520 1931038
断点
month Q1 Q2 Q3 Q4 Q5
201001 322770 1038300 2112300 4597580 28919700
201512 379340 1239800 2840630 7785700 46209140
我想知道使用 findInterval
和 data.table
是否值得追求并且速度更快。这是改编自 this answer 我认为很有帮助。
findInterval
找到一个向量在另一个向量中的索引(假设另一个是非递减的)。在这种情况下,从 Q1
到 Q5
的 breakpoints
列形成第二个向量,函数将 return 基于第一个中的 firmSize
值的索引数据框。
library(data.table)
setDT(df)
setkey(df, month)
setDT(breakpoints)
setkey(breakpoints, month)
df[, quintile := findInterval(firmSize, breakpoints[.BY][, Q1:Q5]) + 1, by = month][]
输出
month firmID firmSize quintile
1: 201001 46603210 9738635 5
2: 201001 72913210 1166077 3
3: 201001 621210 3884422 4
4: 201512 75991610 2932127 4
5: 201512 45383610 1241272 3
6: 201512 5766520 1931038 3