![](/img/trans.png)
[英]How to get equal-sized subplots with different multi-figure layouts in R and grid
[英]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.