我有一个带有数值变量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
语句如何固定以计算限制在所有因子水平的四分位数范围内的均值?也欢迎其他解决方案。
我没有检查数字是否正确,但是使用data.table包中的data.table()
而不是data.frame,应该可以满足我的要求。
dt1[V1 > quantile(V1, 0.25) & V1 < quantile(V1, 0.75), mean(V1), keyby = Effect]