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

use*_*524 3 r dplyr

之后如何使用自定义函数group_by()?我检查了类似的帖子(12,和3),但是我当前的代码返回相同值的所有组。

> 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))
}
Run Code Online (Sandbox Code Playgroud)

我想让(a)村庄有(500 + 400)/ 2 = 450,而让“ b”村庄有700。

tal*_*lat 6

如果您从不带任何附加功能的情况下开始编写,则更容易理解。在这种情况下,它将是:

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.
Run Code Online (Sandbox Code Playgroud)

因此,您的功能应类似于

Y_hat_village <- function(Ycol, Zcol, z){
  mean(Ycol[Zcol == z])
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

df %>%
  group_by(village) %>%
  summarize(Y_village = Y_hat_village(Y, Z, z))
Run Code Online (Sandbox Code Playgroud)

请注意,我编写的函数仅处理可以从内部直接提供的原子向量summarise。您不需要向其中提供整个data.frame。

  • @JorgeLopez 这里:https://dplyr.tidyverse.org/articles/grouping.html#cur_group-and-cur_group_id (3认同)
  • @user2978524 `cur_data()` 指的是特定组中的数据 (2认同)
  • @JoséLuizFerreira,你是怎么找到 cur_data() 的???你让我免于花几个小时上网。我想阅读您学到这一点的来源/手册:) (2认同)