如何根据变量的平均值对R中的数据帧中的行进行子集化?

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

我在R中有一个数据框,其中包含120个观察值(参与者)。所有样本的平均年龄为51岁(范围为25-90)。我想从这些观察中随机选择60个,将其平均分为40个。有没有办法做到这一点?我宁愿避免手动修整,以免可能由此而引起的问题。

我感谢可以提供的任何帮助!

r subset trim
1个回答
0
投票

如果您限制样本具有特定的均值,则它不是真正的随机样本。但是,有多种方法可以做到这一点,但都不容易。这取决于您样本中的年龄分布,我当然没有。

无论如何,以下数据框在某种程度上类似于您的数据框:

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
© www.soinside.com 2019 - 2024. All rights reserved.