dplyr:在 group_by() 后使用自定义函数进行 summarize()

11
如何在group_by()之后使用自定义函数? 我查看了类似的帖子(1, 2, 和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))
}

我希望村庄“a”拥有(500 + 400)/2 = 450,村庄“b”拥有700。

1个回答

15

如果你先不使用额外的函数来写代码,那么理解起来会更容易。此时代码应该是这样的:

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中提供。您不需要将整个数据框传递给它。


谢谢!还有一个后续问题:是否可以将tibble的一部分传递给函数?在这种情况下,例如传递村庄为“a”的tibble的一部分。 - user2978524
1
@user2978524,你最好将其作为一个新问题提出。 - talat
3
cur_data()指的是特定组别中的数据。 - José Luiz Ferreira
1
@JoséLuizFerreira,你是怎么发现cur_data()的???你让我省了好几个小时在网上寻找。我想阅读你学习这个函数的源代码/手册 :) - Jorge Lopez
2
@JorgeLopez 这里:https://dplyr.tidyverse.org/articles/grouping.html#cur_group-and-cur_group_id - José Luiz Ferreira
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接