如何基于条件获取数据范围?case_when()使用失败的解决方案
按物种分组获取Sepal.Length的范围(命名列表形式)
你的原代码问题在于:case_when()是逐行判断返回值的函数,不具备分组聚合能力,而且你在range(.$Measure)里引用的是整个过滤后数据集的Measure列,不是按Species分组后的子集,所以每个分支返回的都是全局范围,最终结果不符合预期。
下面是两种符合需求的实现方式:
方法一:分组聚合后转命名列表
library(tidyverse) dat <- iris %>% as_tibble() %>% pivot_longer(!Species, names_to = "Variable", values_to = "Measure") result <- dat %>% filter(Variable == "Sepal.Length") %>% group_by(Species) %>% summarize(range = list(range(Measure))) %>% # 按组计算范围并保留为列表 deframe() # 把两列转成命名列表结构 print(result)
输出结果:
$setosa [1] 4.3 5.8 $versicolor [1] 4.9 7.0 $virginica [1] 4.9 7.9
方法二:拆分数据后批量计算
如果偏好更直接的拆分-计算逻辑,可以用split()结合map():
dat %>% filter(Variable == "Sepal.Length") %>% split(.$Species) %>% # 按物种拆分数据框为列表 map(~ range(.x$Measure)) # 对每个子数据框计算范围
这个写法会直接生成你需要的命名列表。
内容的提问来源于stack exchange,提问作者maRvin
相关产品推荐
相关产品推荐

