You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中自动将数据表行重组为指定嵌套列表结构?

在R中自动嵌套列生成指定结构的列表

方法一:使用tidyverse工具链(推荐)

先构造示例数据,再通过自动识别列前缀完成嵌套转换:

# 构造示例数据
df <- data.frame(
  Name = c("Alice", "Bob"),
  Location = c("NY", "LA"),
  Dates.Start = as.Date(c("2023-01-01", "2023-02-01")),
  Dates.End = as.Date(c("2023-01-10", "2023-02-10")),
  Info.Age = c(30, 25),
  Info.Gender = c("F", "M")
)

library(tidyverse)

# 1. 自动识别需要嵌套的字段前缀(基于列名的点分隔符)
col_prefixes <- str_split(names(df), "\\.", simplify = TRUE)[,1]
nested_fields <- unique(col_prefixes[duplicated(col_prefixes)])

# 2. 批量嵌套对应列,并去除子列名的前缀
result_df <- df %>%
  nest(!!!set_names(map(nested_fields, ~starts_with(.x)), nested_fields)) %>%
  mutate(across(all_of(nested_fields), ~map(.x, ~rename_with(.x, ~str_remove(.x, "^.+\\.")))))

# 3. 转换为每行一个列表的格式
result_list <- result_df %>%
  rowwise() %>%
  mutate(row_data = list(cur_data())) %>%
  pull(row_data)

查看结果示例:

# 输出第一个列表元素
result_list[[1]]

输出结构:

$Name
[1] "Alice"

$Location
[1] "NY"

$Dates
  Start      End
1 2023-01-01 2023-01-10

$Info
  Age Gender
1  30      F

方法二:使用Base R实现(无需额外包)

# 构造示例数据(同前)
df <- data.frame(
  Name = c("Alice", "Bob"),
  Location = c("NY", "LA"),
  Dates.Start = as.Date(c("2023-01-01", "2023-02-01")),
  Dates.End = as.Date(c("2023-01-10", "2023-02-10")),
  Info.Age = c(30, 25),
  Info.Gender = c("F", "M")
)

# 1. 按列名前缀分组
col_names <- names(df)
split_cols <- strsplit(col_names, "\\.")
col_groups <- sapply(split_cols, function(x) if(length(x)==2) x[1] else x[1])
col_groups <- ifelse(col_groups %in% unique(col_groups[duplicated(col_groups)]), col_groups, col_names)

# 2. 拆分数据框并处理嵌套列
split_df <- split.default(df, col_groups)
nested_dfs <- lapply(split_df, function(x) {
  if(ncol(x) > 1) {
    names(x) <- sapply(strsplit(names(x), "\\."), `[`, 2)
    lapply(seq(nrow(x)), function(i) x[i,,drop=FALSE])
  } else {
    as.list(x)
  }
})

# 3. 合并每行的元素
result_list_base <- lapply(seq(nrow(df)), function(i) {
  lapply(nested_dfs, function(x) x[[i]])
})

关键说明

  • 两种方法均基于**列名的分隔符(这里是点.)**自动识别嵌套字段,若你的列用其他分隔符(如下划线_),只需修改str_split或strsplit中的分隔符参数即可。
  • 单列字段(如Name、Location)会直接作为列表元素,多列同前缀的字段会自动合并为data.frame。
  • 全程无需手动逐个指定字段,可自动适配多列场景。

内容的提问来源于stack exchange,提问作者DrNikolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:15:58