gpt4 book ai didi

r - dplyr 条件汇总函数

转载 作者:行者123 更新时间:2023-12-04 01:35:37 28 4
gpt4 key购买 nike

我有这种情况,我需要一个不同的摘要 功能基于一个条件。
例如,使用鸢尾花,如果物种是 setosa,由于某种原因我想要花瓣宽度的总和,否则我想要花瓣宽度的平均值。

天真地,我使用 case_when 写了这个,这不起作用:

iris <- tibble::as_tibble(iris)

iris %>%
group_by(Species) %>%
summarise(pwz = case_when(
Species == "setosa" ~ sum(Petal.Width, na.rm = TRUE),
TRUE ~ mean(Petal.Width, na.rm = TRUE)))

summarise_impl(.data, dots) 中的错误:
栏目 pwz长度必须为 1(汇总值),而不是 50

我最终找到了这样的东西,使用每种方法进行总结,然后在变异中选择我真正想要的方法:
iris %>% 
group_by(Species) %>%
summarise(pws = sum(Petal.Width, na.rm = TRUE),
pwm = mean(Petal.Width, na.rm = TRUE)) %>%
mutate(pwz = case_when(
Species == "setosa" ~ pws,
TRUE ~ pwm)) %>%
select(-pws, -pwm)

但是,创建所有这些汇总值并在最后只选择一个值似乎有点尴尬,尤其是当我的真实 case_when 复杂得多时。我不能在 summarise 中使用 case_when 吗?我的语法有错吗?任何帮助表示赞赏!

编辑:我想我应该指出我有多个条件/函数(假设我有,取决于变量,一些需要均值、总和、最大值、最小值或其他摘要)。

最佳答案

这很容易使用 data.table

library(data.table)
iris2 <- as.data.table(iris)

iris2[, if(Species == 'setosa') sum(Petal.Width)
else mean(Petal.Width)
, by = Species]

更简洁,但可能不那么清楚
iris2[, ifelse(Species == 'setosa', sum, mean)(Petal.Width)
, by = Species]

dplyr你可以做
iris %>% 
group_by(Species) %>%
summarise(pwz = if_else(first(Species == "setosa")
, sum(Petal.Width)
, mean(Petal.Width)))

笔记:

我认为用 tidyr::spread“传播”你的数据可能更有意义这样每一天都有一个温度、降雨量等列。然后你可以使用 summarise以通常的方式。

关于r - dplyr 条件汇总函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50030666/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com