按因子水平分组的数值变量的有限范围的计算平均值

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

我有一个带有数值变量V1和因子变量Effect的数据框:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  Effect = sample(LETTERS[1:4], 100, replace = T)
)

对于每个Effect级别,我想计算落在第一和第三四分位数之间的V1值的均值。我知道如何计算所有因子水平的四分位数:

quants <- aggregate(V1 ~ Effect, data = df, quantile) 
quants
  Effect       V1.0%      V1.25%      V1.50%      V1.75%     V1.100%
1      A -2.30916888 -0.55815839 -0.02854676  0.55115731  1.53261063
2      B -1.96661716 -0.37066003  0.33178196  0.68864025  1.36860228
3      C -1.13813694 -0.42358228  0.01381897  0.92773709  2.16895597
4      D -1.02642090 -0.49385424 -0.22407620  0.72100821  2.18733299

但是现在我在如何使用quants中的信息来一次计算所有因子水平的相关平均值方面感到困难。

到目前为止,我已经尝试过:

我已经将quants转换为使其更易于访问的列:

quants <- as.data.frame.list(quants)

然后我使用了此tapply陈述:

tapply(df$V1, df$Effect, function(x)  mean(x[x >= quants_new$V1.25. & x <= quants_new$V1.75.]))

但是结果不正确,并且有警告:

           A            B            C            D 
 0.172908276  0.167233413  0.002957323 -0.108590409 
Warning messages:
1: In x >= quants_new$V1.25. :
  longer object length is not a multiple of shorter object length
2: In x <= quants_new$V1.75. :
  longer object length is not a multiple of shorter object length
3: In x >= quants_new$V1.25. :
  longer object length is not a multiple of shorter object length
4: In x <= quants_new$V1.75. :
  longer object length is not a multiple of shorter object length

tapply语句如何固定以计算限制在所有因子水平的四分位数范围内的均值?也欢迎其他解决方案。

r quantile
1个回答
0
投票

我没有检查数字是否正确,但是使用data.table包中的data.table()而不是data.frame,应该可以满足我的要求。

dt1[V1 > quantile(V1, 0.25) & V1 < quantile(V1, 0.75), mean(V1), keyby = Effect]
© www.soinside.com 2019 - 2024. All rights reserved.