防止在展开数据时舍入数字

  • 本文关键字:舍入 数字 数据 r
  • 更新时间 :
  • 英文 :


我有一个名为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)),]

最新更新