r - 计算分组平均值,同时在 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))
任何帮助将非常感激!
解决方案
我们可以创建一个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')
推荐阅读
- python - 解析请求后调用中的 ssl 证书数据时无法解密错误
- java - Junit:org.junit.ComparisonFailure 问题,在 mvn clean install 时添加了额外的 $jacocoData +XXXX
- java - WebFluxConfigurer 在 Spring webflux 中因功能路由而损坏?
- node.js - UnhandledPromiseRejectionWarning:错误:表的权限被拒绝
- android - 任务 ':app:kaptDebugKotlin' 执行失败 - 使用 Hilt 时发生错误
- scala - 根据地图的内容更新数据框的行
- bootstrap-4 - 引导程序中“标签”和“输入”之间的间距
- flutter - 在 Flutter 中使用导入包的不同方法
- python - 如何组合多标签分类器的分数?
- scala - 类型不匹配。必需:布尔值,在 Scala 中找到:Future[Boolean]