r - 计算除当前组之外的所有组的平均值
问题描述
我有一个数据框,其中包含两个分组变量“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 == 1
and定义的组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
解决方案
使用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
推荐阅读
- django - 通过文件名获取 ImageField 中文件的实例
- html - background-size: 100% 100% 上传后不起作用
- python - 使用 CV2 对视频进行镜像/对称效果
- python - BeautifulSoup - 不能按标点符号过滤列表结果
- numpy - np.dot 给出关于形状的值错误
- python - 使用 sympy 象征性地获得分数的实部
- javascript - 升级 vuejs 应用程序时如何解决此错误?
- go - 未找到导入“google/api/annotations.proto”或有错误。如何将其添加为依赖项?
- gradle - 由于 hermes-debug.aar 参考,gradle bundleDebugAar 步骤失败
- javascript - Antd 如何使用一种 onLoad 或 componentDidMount 函数?