簡體   English   中英

R:將加權列分成相等大小的存儲桶

[英]R: Split weighted column into equal-sized buckets

我想使用類似dplyr的cut_number方式將一列拆分為觀察值大致相同的存儲桶,其中我的數據集采用緊湊形式,其中每一行都有權重(觀察數)。

數據框示例:

df <- data.frame(
    x=c(18,17,18.5,20,20.5,24,24.4,18.3,31,34,39,20,19,34,23),
    weight=c(1,10,3,6,19,20,34,66,2,3,1,6,9,15,21)
)

如果每行有一個x觀測值,我將簡單地使用df$bucket <- cut_number(df$x,3)x划分為3個存儲桶,並具有大致相同的觀測值數量。 但是我如何考慮到每一行都帶有一定數量的觀察值的事實呢? 我想避免將每一行拆分為weight行,因為原始數據框已經具有數百萬行。

這是另一種方法,基於我的假設,即您總共擁有x1 * weight1 + x2 * weight2 + .....個觀測值。 此外,每個“唯一”的觀察只能在一個桶中。 該方法使用排序和權重的累加總和來創建存儲桶。

#sort data
df <- df[order(df$x),]

#calculate cumulative weights (this is why we sort)
df$cumulative_weight <- cumsum(df$weight)

#create bucket by cumulative weight
n_buckets <- 3
df$bucket <- cut(df$cumulative_weight, n_buckets)

#check: calculate total number of observations per bucket   


> aggregate(weight~bucket,FUN=sum, data=df)
       bucket weight
1 (9.79,78.7]     77
2  (78.7,147]     64
3   (147,216]     75

根據評論,我認為這可能是您要尋找的時間間隔集。 對此道歉,我們深表歉意:

dfTest <- data.frame(x=1:6, weight=c(1,1,1,1,4,1))

f <- function(df, n) {
  interval <- round(sum(df$weight) / n)
  buckets <- vector(mode="integer", length(nrow(df)))
  bucketNum <- 1
  count <- 0
  for (i in 1:nrow(df)) {
    count <- count + df$weight[i]
    buckets[i] <- bucketNum
    if (count >= interval) {
      bucketNum <- bucketNum + 1
      count <- 0
    }
  }
  return(buckets)
}

運行此功能可以按以下方式存儲項目:

dfTest$bucket <- f(dfTest, 3)

#    x weight bucket
#  1 1      1      1
#  2 2      1      1
#  3 3      1      1
#  4 4      1      2
#  5 5      4      2
#  6 6      1      3

例如:

df$bucket <- f(df, 3)
#        x weight bucket
#  1  18.0      1      1
#  2  17.0     10      1
#  3  18.5      3      1
#  4  20.0      6      1
#  5  20.5     19      1
#  6  24.0     20      1
#  7  24.4     34      1
#  8  18.3     66      2
#  9  31.0      2      2
#  10 34.0      3      2
#  11 39.0      1      2
#  12 20.0      6      3
#  13 19.0      9      3
#  14 34.0     15      3
#  15 23.0     21      3

暫無
暫無

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

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