【发布时间】:2018-10-06 10:13:24
【问题描述】:
我有这种情况,我需要基于条件的不同摘要函数。 例如,使用 iris,假设出于某种原因,如果物种是 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 复杂得多时。我不能在摘要中使用 case_when 吗?我的语法错了吗?任何帮助表示赞赏!
编辑:我想我应该指出我有多个条件/函数(假设我有一些需要均值、总和、最大值、最小值或其他摘要的变量,具体取决于变量)。
【问题讨论】:
-
听起来真正的问题可能是您的数据不是“整洁”的格式。根据其他列值对同一列中的值执行不同的汇总是非常奇怪的。你不能像那样使用
case_when,因为它是一个矢量化函数,所以它不会崩溃(你一次只能取一个值的总和/平均值)。 -
它是长格式 - 不同变量随时间(每天)按地区观察的环境数据。我正在创建每周摘要,但是,例如,您需要添加降雨量才能获得该周的总降雨量,但对于温度,则取一周内的平均值。所以这可能很奇怪,但对这个数据集来说是有意义的。这是关于它是一个非折叠矢量化函数的有用信息 - 这告诉我为什么我的第一次尝试没有奏效,谢谢。