dplyr:在group_by()之后在summarize()中使用自定义函数

时间:2018-06-19 10:06:55

标签: r dplyr

我们如何在group_by()之后使用自定义功能? 我检查了类似帖子(123),但我当前的代码为所有群组返回了相同的值。

> data
   village     A     Z      Y 
     <chr> <int> <int>   <dbl> 
 1       a     1     1   500     
 2       a     1     1   400     
 3       a     1     0   800  
 4       b     1     0   300  
 5       b     1     1   700  

z <- 1
data %>%
    group_by(village) %>%
    summarize(Y_village = Y_hat_village(., z))

Y_hat_village <- function(data_village, z){
    # Calculate the mean for a specific z in a village
    data_z <- data_village %>% filter(Z==get("z"))
    return(mean(data_z$Y))
}

我希望(500 + 400)/ 2 = 450用于村庄&#34; a&#34;村庄为700&#34; b&#34;。

1 个答案:

答案 0 :(得分:5)

如果你在没有额外功能的情况下编写它,就会更容易理解。在那种情况下,它将是:

df %>%
  group_by(village) %>%
  summarize(Y_village = mean(Y[Z == z]))

## A tibble: 2 x 2
#  village Y_village
#  <fct>       <dbl>
#1 a            450.
#2 b            700.

因此,你的功能应该是

Y_hat_village <- function(Ycol, Zcol, z){
  mean(Ycol[Zcol == z])
}

然后使用它:

df %>%
  group_by(village) %>%
  summarize(Y_village = Y_hat_village(Y, Z, z))

请注意,我编写的函数仅处理可以直接从summarise内提供的原子向量。您无需将整个data.frame提供给它。