我有一个名为df的大数据帧,有1481581个观测值。我想做的是基于权重变量扩展我的数据框架。我在扩展后的实际观察次数应该是75149669,但当我扩展数据时,由于舍入权重值,一些观察被省略了。我的问题是如何在不取整的情况下扩展我的数据。任何帮助都将不胜感激。
district residence gender age weight Id
1 00 3 2 23 49.4216 1
2 00 3 1 44 49.4216 2
3 00 3 1 71 49.4216 3
4 00 3 1 33 49.4216 4
5 00 3 1 18 49.4216 5
6 00 3 1 51 49.4216 6
7 00 3 1 65 49.4216 7
8 00 3 1 24 49.4216 8
9 00 3 1 41 49.4216 9
10 00 3 2 7 49.4216 10
11 00 3 1 53 49.4216 11
12 00 3 2 12 49.4216 12
13 00 3 1 14 49.4216 13
14 00 3 2 35 49.4216 14
15 00 3 2 12 49.4216 15
16 00 3 2 21 49.4216 16
17 00 3 1 17 49.4216 17
18 00 3 2 37 49.4216 18
19 00 3 2 71 49.4216 19
df1 <- df [rep(1:nrow(df), df$weight),]
不可能将一行重复49.4216次,因此您可以通过四舍五入权重来处理此问题,这样可以保留总和,并使用以下内容:
c.weights <- round(cumsum(df$weight), 0) #cumulative weights, rounded
i.weights <- c(c.weights[1], diff(c.weights)) #weight for each row as integer
df1 <- df [rep(1:nrow(df), i.weights),]
因此,一些重量为49.4216的行将重复49次,一些行将重复50次以保持总重量。它通过使用列下权重的累积和(c.weights(来实现这一点,并将其四舍五入到最接近的整数。一行的重复次数是累积总和的差值。
或者,你可以使用你的权重作为之类的样本权重随机抽样
set.seed(0)
df1 <- df[sample(nrow(df), sum(df$weight) replace=TRUE, prob=df$weight)),]
由于随机采样,行可能看起来比预期的更多或更少,但行的(数学上(预期副本数将与权重匹配。
你想要这个吗?
df1 <- df [rep(1:nrow(df), ceiling(df$weight)),]