创建一个由5个随机抽样观测值的平均值组成的数据框。

问题描述 投票:0回答:1

我目前正在阅读《数据科学家的实用统计学》,并在R中跟着他们演示一些代码。有一段代码我特别难以理解其逻辑,希望有人能帮助我。有关的代码是创建一个有1000行的数据框,其中每个观测值是从数据框中随机抽取的5个收入值的平均值。loans_income. 然而,我对代码的逻辑感到困惑,因为它是相当复杂的,有一个 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() 的声明和 1000*5 的部分 sample() 函数。如果能帮助理解代码的逻辑,我们将非常感激。

作为参考,原始数据集 loans_income 只是有一列50000个收入值。

r logic sample tapply rep
1个回答
0
投票

你有50000个贷款_收入的单一向量。让我们把你的代码分解一下。

tapply(sample(loans_income$income,1000*5),
       rep(1:1000,rep(5,1000)),
       FUN = mean)

我会用10代替1000,用随机数代替收入,这样更容易解释。我还设置了 set.seed(1) 所以结果可以重现。

  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
  1. 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

这些索引将步骤1中的样本 "分组"。所以基本上这个向量告诉我们 R 你的 "样本向量 "的前5个条目属于一起(索引1),接下来的5个条目属于一起(索引2),以此类推。

  1. FUN = mean 只要应用 mean-数据上的功能。

  2. tapply 所以 tapply 将采样数据(sample-部分),并将它们按第二个参数(即 rep()-部分),并适用 mean-功能在每个组上。

如果您熟悉 data.framework 和 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
© www.soinside.com 2019 - 2024. All rights reserved.