【问题标题】:How to subset rows in a dataframe in R according to mean of variable?如何根据变量的平均值对 R 中数据框中的行进行子集化?
【发布时间】:2020-05-24 17:01:54
【问题描述】:

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

感谢您提供的任何帮助!

【问题讨论】:

  • 这不是一件容易的事,如果可能的话。也许您可以使用某种优化来接近您想要的平均值。请检查此thread 询问相同的问题和响应

标签: r subset trim


【解决方案1】:

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

不管怎样,下面的数据框和你的有点相似:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多