首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算除当前组外的所有组的平均值。

计算除当前组外的所有组的平均值。
EN

Stack Overflow用户
提问于 2021-03-28 01:56:32
回答 5查看 154关注 0票数 4

我有一个包含两个分组变量'mkt‘和'mdl’的数据框架,还有一些值'pr':

代码语言:javascript
复制
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”外,每个“mdl”的平均值应计算为所有其他“mdl”中的“pr”的平均值。

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

预期结果:

代码语言:javascript
复制
#   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
EN

回答 5

Stack Overflow用户

发布于 2021-03-28 02:07:05

首先,获取每个mktmdl值的平均值,对于每个mkt,排除当前值,并得到剩余值的平均值。

代码语言:javascript
复制
library(dplyr)
library(purrr)

df %>%
  group_by(mkt, mdl) %>%
  summarise(avgother = mean(pr)) %>%
  mutate(avgother = map_dbl(row_number(), ~mean(avgother[-.x]))) %>%
  ungroup %>%
  inner_join(df, by = c('mkt', 'mdl'))

#    mkt mdl   avgother    pr
#  <dbl> <chr>    <dbl> <dbl>
#1     1 a          110   120
#2     1 a          110   120
#3     1 b          120   110
#4     1 b          120   110
#5     2 a          145   130
#6     2 a          145   130
#7     2 b          130   145
#8     2 b          130   145
#9     2 b          130   145
票数 1
EN

Stack Overflow用户

发布于 2021-03-28 02:48:45

使用data.table,计算和和长度为'mkt‘。然后,在每个mkt-mdl组中,将平均值计算为(mkt sum - group sum) / (mkt length - group length)

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-03-28 13:07:46

考虑多个ave调用的基R,使用sum / count的均值分解版本进行不同级别的分组计算。

代码语言:javascript
复制
df <- within(df, {
      avgoth <- (ave(pr, mkt, FUN=sum) - ave(pr, mkt, mdl, FUN=sum)) /
                  (ave(pr, mkt, FUN=length) - ave(pr, mkt, mdl, FUN=length))
})

df
#   mkt mdl  pr avgoth
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66837762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档