我在R中有一个数据框,其中包含120个观察值(参与者)。所有样本的平均年龄为51岁(范围为25-90)。我想从这些观察中随机选择60个,将其平均分为40个。有没有办法做到这一点?我宁愿避免手动修整,以免可能由此而引起的问题。
我感谢可以提供的任何帮助!
如果您限制样本具有特定的均值,则它不是真正的随机样本。但是,有多种方法可以做到这一点,但都不容易。这取决于您样本中的年龄分布,我当然没有。
无论如何,以下数据框在某种程度上类似于您的数据框:
set.seed(772) df <- data.frame(age = sample(25:90, 120, T), ID = factor(1:120))
我们可以看到它的年龄范围正确且均值正确:
range(df$age) #> [1] 25 90 mean(df$age) #> [1] 51.23333
现在要使样本年龄平均达到40岁,您需要优先从年轻的人群中进行抽样。首先,我们将找到“老”和“年轻”参与者的索引:
young <- which(df$age <= 40) old <- which(df$age > 40)
现在,我们需要(通过循环)尝试大量样本,直到均值接近40。要在不完全截断年龄的情况下进行此操作,对于每个样本,我们将年轻人与老参与者的比例设为2:1 。为此,您的数据中至少需要40位40岁以下的参与者,我想您确实有。
seed <- 1 while(TRUE) { set.seed(seed) young_indices <- young[sample(length(young), 40)] old_indices <- old[sample(length(old), 20)] indices <- c(young_indices, old_indices) if(abs(mean(df$age[indices]) - 40) < 0.25) break seed <- seed + 1 } sample_df <- df[indices,]
现在
sample_df
将包含60位唯一的参与者,平均年龄约为40岁;
nrow(sample_df)
#> [1] 60
mean(sample_df$age)
#> [1] 40.1