如何在R语言中实现分类分组的字典式嵌套列表?
处理R语言中按分类拆分表格为嵌套列表的最佳方法
嘿,作为R语言新手刚接触这种字典式嵌套列表确实容易卡壳,我来给你几个简洁高效的方案,比你写的循环要省心太多啦!
首先先明确你的需求:把表格里的行名(项目)按照value列的分类(1-12)分组,得到一个以分类为索引、对应项目向量为值的列表。先拿你给的示例数据来演示:
# 先构造你的示例表格 myTable <- data.frame(value = c(3, 1, 2, 3, 2), row.names = c("A", "B", "C", "D", "E"))
方法一:用基础R的tapply(最简洁高效)
tapply是R基础包中专门用于分组处理的函数,完全能一步到位实现你的需求:
data <- tapply(rownames(myTable), myTable$value, c)
运行后你会得到和期望一致的结构:
> data $`1` [1] "B" $`2` [1] "C" "E" $`3` [1] "A" "D"
这个结果自动只保留有数据的分类。如果想要强制包含1-12所有分类(哪怕是空的),可以后续补全:
# 创建1-12的空列表 full_data <- vector("list", 12) names(full_data) <- 1:12 # 把有数据的分组填充进去 full_data[names(data)] <- data
方法二:用tidyverse工具链(适合熟悉dplyr的用户)
如果你平时习惯用tidyverse系列包,也可以用dplyr+tibble来实现:
library(dplyr) library(tibble) data <- myTable %>% rownames_to_column("item") %>% # 把行名转成普通列,方便分组操作 group_by(value) %>% summarise(items = list(item)) %>% # 每个分类下的项目存成列表 deframe() # 把两列转换为"分类-项目列表"的结构
说说你原来代码的问题
你写的循环思路是对的,但有点绕而且效率不高:
data[i] <- list()初始化空列表是没问题的,但后续tmp <- data[val]取的是列表的一个元素(还是列表类型),tmp[[name]] <- name其实是给这个子列表添加了命名元素,最后赋值回去的时候逻辑有点冗余。- 基础R的分组函数(比如
tapply、split)都是经过优化的,比手动写循环处理大数据时快很多。
内容的提问来源于stack exchange,提问作者HectorLector
相关产品推荐
相关产品推荐

