使用多个分组变量获取组均值并排除自己的组值
Get group mean with multiple grouping variables and excluding own group value
我正在寻找一种更快的方法来计算具有多个分组变量的组均值,同时排除自己的组值。一个思想实验是从同一年同一州的县中找出一个县的平均值(例如价格),不包括本县的价值。这是一个玩具数据集。
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
上面的代码给了我想要的结果,但是当我将它应用于更大的数据集(具有更多分组变量)时,它变得非常慢。您对如何加快速度有什么建议吗?
如果原方法不正确,还请指出。
一种更有效的方法是 sum
'value' 在按 'state'、'year' 分组后,从 'value' 中减去,然后除以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
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)
)
我正在寻找一种更快的方法来计算具有多个分组变量的组均值,同时排除自己的组值。一个思想实验是从同一年同一州的县中找出一个县的平均值(例如价格),不包括本县的价值。这是一个玩具数据集。
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
上面的代码给了我想要的结果,但是当我将它应用于更大的数据集(具有更多分组变量)时,它变得非常慢。您对如何加快速度有什么建议吗?
如果原方法不正确,还请指出。
一种更有效的方法是 sum
'value' 在按 'state'、'year' 分组后,从 'value' 中减去,然后除以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
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)
)