2

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

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

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

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

4

2 回答 2

2

一种更有效的方法是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
于 2020-01-16T23:01:15.503 回答
2
library(dplyr)

df %>%
  group_by(state, year) %>%
  mutate(q = (sum(value) - value) / (n()-1))

#> # A tibble: 12 x 5
#> # Groups:   state, year [4]
#>    state county  year value     q
#>    <chr> <chr>  <int> <int> <dbl>
#>  1 AL    a       2011    68  30.5
#>  2 AL    a       2012    63  42  
#>  3 AL    b       2011    53  38  
#>  4 AL    b       2012    56  45.5
#>  5 AL    c       2011     8  60.5
#>  6 AL    c       2012    28  59.5
#>  7 CA    d       2011     7  40  
#>  8 CA    d       2012    69  41  
#>  9 CA    e       2011    39  24  
#> 10 CA    e       2012    79  36  
#> 11 CA    f       2011    41  23  
#> 12 CA    f       2012     3  74

数据:

#data_frame is deprecate!
df <- tibble(
  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)
)
于 2020-01-16T23:07:35.263 回答