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

如何将长度不一致的嵌套列表转换为R DataFrame?

解决嵌套列表转DataFrame时的列数不匹配问题

问题场景

我有一个如下所示的嵌套列表,其中部分子列表的字段不全(比如第三个子列表缺少name字段):

sam <- list(list(symbol = "COUNCODOS.NS", name = "Country Condo's Limited", 
          price = 4.8, changesPercentage = 0, change = 0, dayLow = 4.6, 
          dayHigh = 4.9, yearHigh = 7.05, yearLow = 3.4, marketCap = 372467040, 
          priceAvg50 = 5.383, priceAvg200 = 4.77275, exchange = "NSE", 
          volume = 72558, avgVolume = 111060, open = 4.8, previousClose = 4.8, 
          eps = 0.23, pe = 20.87, earningsAnnouncement = "2023-03-31T04:00:00.000+0000", 
          sharesOutstanding = 77597300, timestamp = 1711619840), list(
              symbol = "SPENCERS.NS", name = "Spencer's Retail Limited", 
              price = 91.3, changesPercentage = 0.44, change = 0.4, dayLow = 90.6, 
              dayHigh = 94.55, yearHigh = 139.3, yearLow = 51.5, marketCap = 8229051600, 
              priceAvg50 = 110.369, priceAvg200 = 83.59675, exchange = "NSE", 
              volume = 500311, avgVolume = 814721, open = 92.25, previousClose = 90.9, 
              eps = -27.41, pe = -3.33, earningsAnnouncement = "2024-05-20T00:00:00.000+0000", 
              sharesOutstanding = 90132000, timestamp = 1711619998),list(symbol = "SRPL-RE.NS", price = 0.05, changesPercentage = -50, 
                                                                         change = -0.05, dayLow = 0.05, dayHigh = 0.1, yearHigh = 0.1, 
                                                                         yearLow = 0.05, marketCap = 0, priceAvg50 = 0, priceAvg200 = 0, 
                                                                         exchange = "NSE", volume = 1503842, avgVolume = 0, open = 0.1, 
                                                                         previousClose = 0.1, eps = NA, pe = 0, earningsAnnouncement = NA, 
                                                                         sharesOutstanding = 0, timestamp = 1691575172))

尝试用基础R的方法转换为DataFrame:

do.call(rbind.data.frame, sam)

运行后出现错误:

Error in (function (..., deparse.level = 1, make.row.names = TRUE, stringsAsFactors = default.stringsAsFactors(),  : 
  numbers of columns of arguments do not match

解决方案

方法1:使用dplyr的bind_rows()

bind_rows()会自动识别所有子列表的字段,缺失的字段填充为NA,代码简洁:

library(dplyr)
df <- bind_rows(sam)

方法2:使用data.table的rbindlist()

如果处理大数据量,data.table的效率更高,同样支持自动补全缺失列:

library(data.table)
df <- rbindlist(sam, fill = TRUE)

方法3:基础R手动补全字段

不需要加载额外包,先统一所有子列表的字段,再转换:

# 获取所有子列表的唯一字段名
all_columns <- unique(unlist(lapply(sam, names)))

# 给每个子列表补全缺失字段,值设为NA
sam_filled <- lapply(sam, function(sub_list) {
  missing_cols <- setdiff(all_columns, names(sub_list))
  sub_list[missing_cols] <- NA
  sub_list
})

# 转换为DataFrame
df <- do.call(rbind.data.frame, sam_filled)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:22:47