首页 > 解决方案 > 使用多个分组变量获取组平均值并排除自己的组值

问题描述

我正在寻找一种更快的方法来计算具有多个分组变量的组平均值,同时排除自己的组值。一个思想实验将在同一年从同一州的县中找出一个县的平均值(例如价格),不包括本县的价值。这是一个玩具数据集。

df <- data_frame(
  state = rep(c("AL", "CA"), each = 6),
  county = rep(letters[1:6], each = 2),
  year = rep(c(2011:2012), 6),
  value = sample.int(100, 12)
)

df %>%
  group_by(state, county, year) %>%
  summarise(q = mean(df$value[df$state == state & df$county != county & df$year == year]))

# Groups:   state, county [6]
   state county  year     q
   <chr> <chr>  <int> <dbl>
 1 AL    a       2011  56  
 2 AL    a       2012  46  
 3 AL    b       2011  50.5
 4 AL    b       2012  52  
 5 AL    c       2011  55.5
 6 AL    c       2012  29  
 7 CA    d       2011  52.5
 8 CA    d       2012  32  
 9 CA    e       2011  68.5
10 CA    e       2012  31.5
11 CA    f       2011  32  
12 CA    f       2012  42.5

上面的代码给了我想要的结果,但是当我将它应用到更大的数据集(具有更多分组变量)时,它变得非常慢。您对如何加快速度有什么建议吗?

如果原始方法不正确,请同时指出。

标签: rdataframedplyrgroup-summaries

解决方案


一种更有效的方法是sum 在按“州”、“年”分组后得到“价值”,从“价值”中减去,然后除以n() - 1观察结果

library(dplyr)   
library(purrr) 
out2 <- df %>%
          group_split(state, year) %>%
          map_dfr(~ .x %>% 
                 mutate(q = (sum(value) - value)/(n()-1))) %>%
          select(-value) %>%
          arrange(state, county)

-检查OP的输出('out1')

all.equal(out2, out1, check.attributes = FALSE)
#[1] TRUE

推荐阅读