如何根据变量的均值对 R 中数据框中的行进行子集化?
How to subset rows in a dataframe in R according to mean of variable?
我在 R 中有一个包含 120 个观察值(参与者)的数据框。所有样本的平均年龄为 51 岁(范围 25-90)。我想随机 select 60 个这些观察结果的平均值为 40。有没有办法做到这一点?我宁愿避免手动修整以避免由此产生的问题。
感谢您提供的任何帮助!
如果您将样本限制为具有特定均值,那么它就不是真正的随机样本。但是,有多种方法可以做到这一点,其中 none 很简单。这取决于你样本中的年龄分布,我当然没有。
无论如何,下面的数据框会和你的有点相似:
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 岁,您需要优先从较年轻的群体中抽样。首先,我们将找到 "old" 和 "young" 参与者的索引:
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
我在 R 中有一个包含 120 个观察值(参与者)的数据框。所有样本的平均年龄为 51 岁(范围 25-90)。我想随机 select 60 个这些观察结果的平均值为 40。有没有办法做到这一点?我宁愿避免手动修整以避免由此产生的问题。
感谢您提供的任何帮助!
如果您将样本限制为具有特定均值,那么它就不是真正的随机样本。但是,有多种方法可以做到这一点,其中 none 很简单。这取决于你样本中的年龄分布,我当然没有。
无论如何,下面的数据框会和你的有点相似:
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 岁,您需要优先从较年轻的群体中抽样。首先,我们将找到 "old" 和 "young" 参与者的索引:
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