创建 5 个随机抽样观察值的数据框
creating a dataframe of means of 5 randomly sampled observations
我目前正在阅读 "Practical Statistics for Data Scientists" 并在 R 中跟随他们演示一些代码。有一段代码我特别难以遵循其逻辑,并希望有人能提供帮助。有问题的代码正在创建一个包含 1000 行的数据框,其中每个观察值都是从数据框 loans_income
中随机抽取的 5 个收入值的平均值。但是,我对代码的逻辑感到困惑,因为 tapply()
函数和嵌套的 rep()
语句相当复杂。
创建相关数据框的代码如下:
samp_mean_5 <- data.frame(income = tapply(sample(loans_income$income,1000*5),
rep(1:1000,rep(5,1000)),
FUN = mean),
type='mean_of_5')
特别是,我对嵌套的 rep()
语句和 sample()
函数的 1000*5
部分感到困惑。如果能帮助理解代码的逻辑,我们将不胜感激!
作为参考,原始数据集 loans_income
只有一列包含 50,000 个收入值。
您在单个向量中有 50,000 loans_income。让我们分解您的代码:
tapply(sample(loans_income$income,1000*5),
rep(1:1000,rep(5,1000)),
FUN = mean)
我将用 10 代替 1000,用随机数代替收入,这样更容易解释。我还设置了 set.seed(1)
以便可以重现结果。
sample(loans_income$income,1000*5)
我们从您的向量中随机收入 50 份,无需更换。它们(暂时)放入长度为 50 的向量中,因此输出如下所示:
> sample(runif(50000),10*5)
[1] 0.73283101 0.60329970 0.29871173 0.12637654 0.48434952 0.01058067 0.32337850
[8] 0.46873561 0.72334215 0.88515494 0.44036341 0.81386225 0.38118213 0.80978822
[15] 0.38291273 0.79795343 0.23622492 0.21318431 0.59325586 0.78340477 0.25623138
[22] 0.64621658 0.80041393 0.68511759 0.21880083 0.77455662 0.05307712 0.60320912
[29] 0.13191926 0.20816298 0.71600799 0.70328349 0.44408218 0.32696205 0.67845445
[36] 0.64438336 0.13241312 0.86589561 0.01109727 0.52627095 0.39207860 0.54643661
[43] 0.57137320 0.52743012 0.96631114 0.47151170 0.84099503 0.16511902 0.07546454
[50] 0.85970500
rep(1:1000,rep(5,1000))
现在我们正在创建一个长度为 50 的索引向量:
> rep(1:10,rep(5,10))
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6
[29] 6 6 7 7 7 7 7 8 8 8 8 8 9 9 9 9 9 10 10 10 10 10
那些索引 "group" 来自步骤 1 的样本。所以基本上这个向量告诉 R
你的 "sample vector" 的前 5 个条目属于一起(索引 1),接下来的 5条目属于一起(索引 2)等等。
FUN = mean
只需在数据上应用 mean
-函数。
tapply
因此 tapply
获取采样数据(sample
-部分)并按第二个参数(rep()
-部分)对它们进行分组,并对每个组应用 mean
-函数。
如果你熟悉 data.frames 和 dplyr
包,看看这个(只显示前 10 行):
set.seed(1)
df <- data.frame(income=sample(runif(5000),10*5), index=rep(1:10,rep(5,10)))
income index
1 0.42585569 1
2 0.16931091 1
3 0.48127444 1
4 0.68357403 1
5 0.99374923 1
6 0.53227877 2
7 0.07109499 2
8 0.20754511 2
9 0.35839481 2
10 0.95615917 2
我将索引附加到随机数(您的 income
)。现在我们计算每组的平均值:
df %>%
group_by(index) %>%
summarise(mean=mean(income))
这给了我们
# A tibble: 10 x 2
index mean
<int> <dbl>
1 1 0.551
2 2 0.425
3 3 0.827
4 4 0.391
5 5 0.590
6 6 0.373
7 7 0.514
8 8 0.451
9 9 0.566
10 10 0.435
比较
set.seed(1)
tapply(sample(runif(5000),10*5),
rep(1:10,rep(5,10)),
mean)
产生基本相同的结果:
1 2 3 4 5 6 7 8 9
0.5507529 0.4250946 0.8273149 0.3905850 0.5902823 0.3730092 0.5143829 0.4512932 0.5658460
10
0.4352546
我目前正在阅读 "Practical Statistics for Data Scientists" 并在 R 中跟随他们演示一些代码。有一段代码我特别难以遵循其逻辑,并希望有人能提供帮助。有问题的代码正在创建一个包含 1000 行的数据框,其中每个观察值都是从数据框 loans_income
中随机抽取的 5 个收入值的平均值。但是,我对代码的逻辑感到困惑,因为 tapply()
函数和嵌套的 rep()
语句相当复杂。
创建相关数据框的代码如下:
samp_mean_5 <- data.frame(income = tapply(sample(loans_income$income,1000*5),
rep(1:1000,rep(5,1000)),
FUN = mean),
type='mean_of_5')
特别是,我对嵌套的 rep()
语句和 sample()
函数的 1000*5
部分感到困惑。如果能帮助理解代码的逻辑,我们将不胜感激!
作为参考,原始数据集 loans_income
只有一列包含 50,000 个收入值。
您在单个向量中有 50,000 loans_income。让我们分解您的代码:
tapply(sample(loans_income$income,1000*5),
rep(1:1000,rep(5,1000)),
FUN = mean)
我将用 10 代替 1000,用随机数代替收入,这样更容易解释。我还设置了 set.seed(1)
以便可以重现结果。
sample(loans_income$income,1000*5)
我们从您的向量中随机收入 50 份,无需更换。它们(暂时)放入长度为 50 的向量中,因此输出如下所示:
> sample(runif(50000),10*5)
[1] 0.73283101 0.60329970 0.29871173 0.12637654 0.48434952 0.01058067 0.32337850
[8] 0.46873561 0.72334215 0.88515494 0.44036341 0.81386225 0.38118213 0.80978822
[15] 0.38291273 0.79795343 0.23622492 0.21318431 0.59325586 0.78340477 0.25623138
[22] 0.64621658 0.80041393 0.68511759 0.21880083 0.77455662 0.05307712 0.60320912
[29] 0.13191926 0.20816298 0.71600799 0.70328349 0.44408218 0.32696205 0.67845445
[36] 0.64438336 0.13241312 0.86589561 0.01109727 0.52627095 0.39207860 0.54643661
[43] 0.57137320 0.52743012 0.96631114 0.47151170 0.84099503 0.16511902 0.07546454
[50] 0.85970500
rep(1:1000,rep(5,1000))
现在我们正在创建一个长度为 50 的索引向量:
> rep(1:10,rep(5,10))
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6
[29] 6 6 7 7 7 7 7 8 8 8 8 8 9 9 9 9 9 10 10 10 10 10
那些索引 "group" 来自步骤 1 的样本。所以基本上这个向量告诉 R
你的 "sample vector" 的前 5 个条目属于一起(索引 1),接下来的 5条目属于一起(索引 2)等等。
FUN = mean
只需在数据上应用mean
-函数。tapply
因此tapply
获取采样数据(sample
-部分)并按第二个参数(rep()
-部分)对它们进行分组,并对每个组应用mean
-函数。
如果你熟悉 data.frames 和 dplyr
包,看看这个(只显示前 10 行):
set.seed(1)
df <- data.frame(income=sample(runif(5000),10*5), index=rep(1:10,rep(5,10)))
income index
1 0.42585569 1
2 0.16931091 1
3 0.48127444 1
4 0.68357403 1
5 0.99374923 1
6 0.53227877 2
7 0.07109499 2
8 0.20754511 2
9 0.35839481 2
10 0.95615917 2
我将索引附加到随机数(您的 income
)。现在我们计算每组的平均值:
df %>%
group_by(index) %>%
summarise(mean=mean(income))
这给了我们
# A tibble: 10 x 2
index mean
<int> <dbl>
1 1 0.551
2 2 0.425
3 3 0.827
4 4 0.391
5 5 0.590
6 6 0.373
7 7 0.514
8 8 0.451
9 9 0.566
10 10 0.435
比较
set.seed(1)
tapply(sample(runif(5000),10*5),
rep(1:10,rep(5,10)),
mean)
产生基本相同的结果:
1 2 3 4 5 6 7 8 9
0.5507529 0.4250946 0.8273149 0.3905850 0.5902823 0.3730092 0.5143829 0.4512932 0.5658460
10
0.4352546