r语言 - 获取具有多个分组变量的组均值,并排除自己的组值



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

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

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

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

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)
)

更有效的方法是在按"州"、"年"分组后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

相关内容

最新更新