簡體   English   中英

R:如何使用隨時間變化的斷點有效地進行分箱?

[英]R: How to bin efficiently using time-varying breakpoints?

我正在處理一個包含 1400 萬行的大型數據框,其中包含monthfirmIDfirmSize列。 在一個單獨的數據框中,我有公司規模的每月斷點(基本上是五分位數)。

我的目標是在第一個數據框中添加第四列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 的應用程序的了解非常有限,我想知道是否有人知道如何解決這個問題,這樣我就不必讓我的筆記本電腦運行數周。

先感謝您!

編輯:數據框的示例數據:(感謝里卡多的建議!)

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

我想知道使用findIntervaldata.table是否值得追求和更快。 這是改編自我認為非常有幫助的這個答案

findInterval在另一個向量中找到一個向量的索引(假設另一個向量是非遞減的)。 在這種情況下, breakpoints列從Q1Q5 forms 第二個向量,function 將根據第一個數據幀中的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][]

Output

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM