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

如何根据变量的平均值对R中数据帧中的行进行子集划分?,r,subset,trim,R,Subset,Trim,我在R中有一个数据帧,有120个观察(参与者)。所有样本的平均年龄为51岁(25-90岁)。我想随机选择60个观察值,平均值为40。有没有办法做到这一点?我宁愿避免手动修剪,以避免由此产生的问题 我感谢任何可以提供的帮助 如果您限制您的样本具有特定的平均值,那么它不是真正的随机样本。然而,有多种方法可以做到这一点,其中没有一种是容易的。这取决于样本中的年龄分布,当然我没有 无论如何,以下数据框将与您的数据框类似: set.seed(772) df <- data.frame(age = s

我在R中有一个数据帧,有120个观察(参与者)。所有样本的平均年龄为51岁(25-90岁)。我想随机选择60个观察值,平均值为40。有没有办法做到这一点?我宁愿避免手动修剪,以避免由此产生的问题


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

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

无论如何,以下数据框将与您的数据框类似:

set.seed(772)
df <- data.frame(age = sample(25:90, 120, T), ID = factor(1:120))
现在要使你的样本年龄达到平均40岁,你需要优先从较年轻的群体中取样。首先,我们将找到“老”和“年轻”参与者的指数:

young <- which(df$age <= 40)
old   <- which(df$age > 40)

如果可能的话,这不是一件容易的事。也许你可以使用某种优化来接近你想要的平均值。请检查此项,询问相同的问题和回答
young <- which(df$age <= 40)
old   <- which(df$age > 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,]
nrow(sample_df)
#> [1] 60
mean(sample_df$age)
#> [1] 40.1