首页 > 解决方案 > 计算分组平均值,同时在 R (dplyr) 中保留单行组

问题描述

我正在尝试计算数据集的均值 + 标准差。我有一个组织列表,但一个组织只有一行“cpue”。当我尝试计算每个组织和另一个变量(学名)的分组平均值时,该组织被删除并产生 NA。但是,我想保留单组值,并将其放在“平均值”列中,以便我可以绘制它(没有 sd)。有没有办法告诉 dplyr 在计算平均值时保留单行的组?数据如下:

  l<-  df<- data.frame(organization = c("A","B", "B", "A","B", "A", "C"),
             species= c("turtle", "shark", "turtle", "bird", "turtle", "shark", "bird"),
             cpue= c(1, 2, 1, 5, 6, 1, 3))

  l2<- l %>% 
       group_by( organization, species)%>%
       summarize(mean= mean(cpue),
                 sd=sd(cpue))

任何帮助将非常感激!

标签: rdplyr

解决方案


我们可以创建一个if/else条件sd来检查行数,即if n() ==1然后返回'cpue'或else计算sd'cpue'

library(dplyr)
l1 <-  l %>% 
   group_by( organization, species)%>%
   summarize(mean= mean(cpue),
             sd= if(n() == 1) cpue else sd(cpue), .groups = 'drop')

-输出

l1
# A tibble: 6 x 4
#  organization species  mean    sd
#* <chr>        <chr>   <dbl> <dbl>
#1 A            bird      5    5   
#2 A            shark     1    1   
#3 A            turtle    1    1   
#4 B            shark     2    2   
#5 B            turtle    3.5  3.54
#6 C            bird      3    3   

如果条件基于分组变量“组织”的值,则if/else通过提取分组变量来创建条件cur_group()

l %>% 
   group_by(organization, species) %>% 
   summarise(mean = mean(cpue),
       sd = if(cur_group()$organization == 'A') cpue else sd(cpue), 
            .groups = 'drop')

推荐阅读