如何在tibble单个单元格存储向量并将多值拆分到不同列
你原始代码不符合预期的核心原因是:rowwise()分组下直接返回长度大于1的向量时,dplyr会自动将行扩展为对应长度,最终得到的是20行的结果而非10行,提取range[[1]]时也会取到全局的第一个值而非每行的第一个分位数。只需要把quantile()的返回值用list()包裹为单行list元素即可修复你的原有逻辑。
可用实现方案
方案1:修正你的原有写法
library(tidyverse) tibble(category = LETTERS[1:10]) %>% rowwise() %>% # 用list()包裹返回值,避免自动扩行 mutate(range = list(quantile(rnorm(100), c(0.025, 0.975), names = FALSE)) ) %>% mutate(lo = range[[1]], hi = range[[2]]) %>% ungroup() %>% select(-range)
方案2:用unnest_wider自动拆分(代码更简洁)
不需要手动提取每个位置的值,自动拆分为多列:
tibble(category = LETTERS[1:10]) %>% rowwise() %>% mutate(range = list(quantile(rnorm(100), c(0.025, 0.975), names = FALSE))) %>% unnest_wider(range, names_repair = ~c("category", "lo", "hi")) %>% ungroup()
方案3:purrr向量化实现(性能更优,适合大数据量场景)
避免rowwise()的性能损耗,用map批量处理:
tibble(category = LETTERS[1:10]) %>% mutate( range = map(category, ~quantile(rnorm(100), c(0.025, 0.975), names = FALSE)) ) %>% unnest_wider(range, names_repair = ~c("category", "lo", "hi"))
内容的提问来源于stack exchange,提问作者sharoz
相关产品推荐
相关产品推荐

