嵌套tibble函数未达预期输出:批量分位数计算优化
解决嵌套分组批量计算分位数的问题
首先,咱们来拆解一下你遇到的问题:你的原错误代码核心问题是没必要为每个物种单独创建列——因为你已经按Species和years完成了分组嵌套,每个data对应的都是单一物种+单一年份的子集,再给每个分组强行加virginica_Q或Setosa_Q列完全是多余的,还会导致列名和实际分组不匹配的混乱。
你的简化思路是对的!统一处理所有嵌套数据集的方案完全可行,而且还能进一步优化得更简洁。
优化后的完整代码
先构造一个带years列的示例数据集(方便你复现):
library(tidyverse) # 生成带年份列的模拟数据 set.seed(123) iris_with_years <- iris %>% mutate(years = sample(1:3, n(), replace = TRUE))
然后完成嵌套+批量计算分位数:
nested_iris <- iris_with_years %>% group_by(Species, years) %>% nest(data = -c(Species, years)) %>% # 新版本tidyverse推荐的嵌套写法,等价于nest(.key = "data") mutate( # 合并两次map为一次,更高效 data_with_quantiles = map(data, ~ .x %>% select(Sepal.Length, Sepal.Width) %>% mutate(myQuantiles = ntile(Sepal.Length, 4))) )
为什么这个方案可行?
- 每个嵌套的
data都是Species+years的唯一组合,所以map里的ntile计算是针对每个分组单独进行的,和你手动filter单个分组后计算的结果完全一致。 - 统一用
myQuantiles作为列名,避免了原代码中列名和分组物种不匹配的问题,结构更清晰。
验证结果是否正确
你可以提取任意一个分组的结果和手动计算对比:
# 查看virginica + years=1的分组结果 nested_iris %>% filter(Species == "virginica", years == 1) %>% pull(data_with_quantiles) %>% pluck(1) # 手动计算对比 iris_with_years %>% filter(Species == "virginica", years == 1) %>% select(Sepal.Length, Sepal.Width) %>% mutate(Q_vir_sep_len = ntile(Sepal.Length, 4))
对比后你会发现两者的分位数结果完全一致,说明这个方案是正确的。
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

