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

R语言如何复制dataframe行并为新增列填充列表对应元素

R按count值展开数据框并拆分列表列的实现方法

问题背景

现有如下结构的测试数据框:

tester <- data.frame(id = c(123456789, 987654321))
tester$furniture <- list(c("chair"), c("bed", "bench", "barstool"))
tester$count <- c(1,3)

数据字段说明:

  • id:存储主体ID
  • furniture:列表类型列,每个元素为对应行关联的家具名称向量,向量长度与同行count取值完全相等
  • count:标记每行需要重复展开的次数

之前尝试通过行索引重复的方式实现行展开:

# 注意原代码中tester_2为笔误,实际应传入原始数据框对象tester
tester[rep(seq_len(dim(tester)[1]), tester$count), ]

但直接在展开前的原始数据框(仅2行)上赋值长度为4的新列向量会触发长度不匹配错误,且手动拼接向量容易出现顺序错误(比如手动写的c("chair", "bench", "bed", "barstool")就和第二行原始家具顺序bed>bench>barstool不符)。

可行实现

方法1:Base R 原生无依赖实现

不需要安装第三方包,两步即可完成:

  1. 先按count值完成行重复
  2. 直接将furniture列表列拆分为普通向量,赋值给新列即可——由于已保证每个子列表长度与对应行count值一致,拆分后的向量顺序和展开后的行顺序完全匹配
# 行展开
tester_expand <- tester[rep(seq_len(nrow(tester)), tester$count), ]
# 拆分列表列赋值
tester_expand$single_furniture <- unlist(tester$furniture)

运行后得到的结果符合预期:第一行对应chair,第二行展开的3行依次对应bed、bench、barstool。

方法2:tidyverse 一步实现

如果日常使用tidyverse生态处理数据,可以直接用tidyr的行展开函数,不需要手动写行重复逻辑,函数会自动根据列表列长度完成展开、拆分,自动维护顺序匹配:

library(dplyr)
library(tidyr)

tester_expand <- tester %>%
  unnest_longer(furniture, values_to = "single_furniture")

运行后直接得到展开结果,不需要额外做长度、顺序校验,只要列表列元素长度和count对应就不会出错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:06:24