首页 > 解决方案 > 计算除当前组之外的所有组的平均值

问题描述

我有一个数据框,其中包含两个分组变量“mkt”和“mdl”,以及一些值“pr”:

df <- data.frame(mkt = c(1,1,1,1,2,2,2,2,2),
                 mdl = c('a','a','b','b','b','a','b','a','b'),
                 pr = c(120,120,110,110,145,130,145,130, 145))

df

  mkt mdl  pr
1   1   a 120
2   1   a 120
3   1   b 110
4   1   b 110
5   2   b 145
6   2   a 130
7   2   b 145
8   2   a 130
9   2   b 145

在每个“mkt”中,每个“mdl”的平均“pr”应计算为同一“mkt”中所有其他“mdl”的“pr”平均值,当前“mdl”除外。

例如,对于由mkt == 1and定义的组mdl == a,'avgother' 计算为mkt == 1(相同的 'mkt')和mdl == b(除当前组之外的所有其他 'mdl' )的 'pt' 的平均值a

期望的结果:

#   mkt mdl  pr avgother
# 1   1   a 120      110
# 2   1   a 120      110
# 3   1   b 110      120
# 4   1   b 110      120
# 5   2   b 145      130
# 6   2   a 130      145
# 7   2   b 145      130
# 8   2   a 130      145
# 9   2   b 145      130

标签: rgroup-byaveragemean

解决方案


使用data.table,通过“mkt”计算总和和长度。然后,在每个 mkt-mdl 组内,计算平均值为(mkt sum - group sum) / (mkt length - group length)

library(data.table)
setDT(df)[ , `:=`(s = sum(pr), n = .N), by = mkt]
df[ , avgother := (s - sum(pr)) / (n - .N), by = .(mkt, mdl)]
df[ , `:=`(s = NULL, n = NULL)]
#    mkt mdl  pr avgother
# 1:   1   a 120      110
# 2:   1   a 120      110
# 3:   1   b 110      120
# 4:   1   b 110      120
# 5:   2   b 145      130
# 6:   2   a 130      145
# 7:   2   b 145      130
# 8:   2   a 130      145
# 9:   2   b 145      130

推荐阅读