R语言:按分组生成与指定列关联的向量列表(无关列顺序)
嘿,我完全get到你的需求了——你需要按id分组生成命名向量列表,每个向量的元素名对应df$a,值对应df$b,而且不想依赖先排序再split的方式,还要比你之前的spread+循环方案更优雅对吧?
这里有几个基于tidyverse(dplyr+purrr)的简洁方案,完美满足你的需求:
方案1:group_by + summarise + set_names
这是最直接的方式,一步到位:
library(dplyr) library(purrr) df <- tibble(id = paste0('id',rep(1:2, each = 5)), a = rep(letters[1:5],2), b=c(1:5,5:1)) result <- df %>% group_by(id) %>% summarise(named_vec = list(set_names(b, a))) %>% pull(named_vec) # 查看结果 result # [[1]] # a b c d e # 1 2 3 4 5 # # [[2]] # a b c d e # 5 4 3 2 1
group_by(id):按id分组summarise(list(set_names(b, a))):对每个组,用set_names把b向量的元素名设置为对应的a值,再打包成列表列pull(named_vec):直接提取列表列,得到你需要的纯列表,没有多余元素
方案2:nest + map
如果你习惯用嵌套数据框的思路,这个方案也很清晰:
result <- df %>% nest(data = c(a, b)) %>% # 把每个id对应的a和b嵌套成数据框列 mutate(named_vec = map(data, ~set_names(.x$b, .x$a))) %>% # 遍历每个嵌套数据框生成命名向量 pull(named_vec)
这个方案和方案1结果完全一致,只是用nest先把分组数据打包,再用map逐个处理,逻辑更直观。
为什么这比你的原方案更好?
- 完全避免了手动循环和spread操作,代码更简洁易读
- 直接在分组内完成命名绑定,不需要额外处理顺序问题
- 结果正好是你需要的两个元素的列表,没有多余的第一个元素
这样你就可以直接把result里的每个向量传入你的函数啦!
内容的提问来源于stack exchange,提问作者tjebo
相关产品推荐
相关产品推荐

