我有这种情况,我需要根据条件得到不同的摘要 function . 例如,使用虹膜,出于某种原因,如果物种是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吗?我的语法错了吗?任何帮助表示赞赏!
编辑:我想我应该指出我有多个条件/功能(假设我有,取决于变量,一些需要平均值,总和,最大值,最小值或其他摘要) .
5 回答
data.table
这很容易更简洁,但也许不那么清楚
你可以用
dplyr
做注意:
我想_1118574_你的数据
tidyr::spread
可能更有意义,所以每天都有一个温度,降雨量等的列 . 然后你可以用通常的方式使用summarise
.如果你想把所有东西放在汇总函数中,你总是可以做这样的事情 . 但它并不比原来的解决方案复杂:
为什么不首先在行级计算,然后总结?
您可以拆分
data.frame
然后使用map2_dfr
在每个零件上应用不同的功能并将结果重新拼接在一起: