如何将DataFrame按行转换为含分组矩阵的嵌套列表?
解决DataFrame按行转嵌套分组矩阵列表的问题
需求场景
现有如下DataFrame,需要按a列的行值作为外层列表的名称,将每行的b/c列、d/e列分别组合成独立的列矩阵,最终生成嵌套列表结构。
原始数据:
df = data.frame(a=c("foo", "bar", "baz"), b=1:3, c=3:1, d=4:6, e=6:4)
期望输出结构:
dflist <- list(foo=list(as.matrix(c(1,3)), as.matrix(c(4,6))), bar=list(as.matrix(c(2,2)), as.matrix(c(5,5))), baz=list(as.matrix(c(3,1)), as.matrix(c(6,4))))
解决方案
方法一:Base R实现
无需额外依赖包,通过拆分数据+嵌套循环处理列分组:
# 定义需要分组的列集合 col_groups <- list(c("b", "c"), c("d", "e")) # 按a列拆分数据,逐组生成嵌套矩阵列表 dflist <- lapply(split(df, df$a), function(row_data) { lapply(col_groups, function(cols) { # 将指定列的值转为向量后生成列矩阵(与示例结构一致) as.matrix(unlist(row_data[cols])) }) })
方法二:Tidyverse工具链实现
适合熟悉dplyr和purrr的用户,代码逻辑更直观:
library(dplyr) library(purrr) dflist <- df %>% split(.$a) %>% map(function(row_data) { list( as.matrix(c(row_data$b, row_data$c)), as.matrix(c(row_data$d, row_data$e)) ) })
验证结果
运行上述任意代码后,dflist的结构与期望输出完全一致。核心逻辑是:先按a列拆分数据为单个行的子集,再对每个子集提取指定列的值,转为矩阵后包装为嵌套列表。
内容的提问来源于stack exchange,提问作者scjForR
相关产品推荐
相关产品推荐

