R语言导出列表内含嵌套列的dataframe为CSV异常问题求解
问题根源
导出文件体积异常、price列出现大量c()包裹冗余值的核心原因是:Coins_list$data中的price列不是普通的存储单个值的向量,而是嵌套列表列(list-column),每一行存储的是长度大于1的向量甚至小型嵌套数据框。write.csv函数仅支持导出普通二维表结构,遇到嵌套列表列时会强制把整个列表对象转成长文本字符串写入,就会出现内容重复、文件超大的问题。
CSV本身是纯文本二维表格格式,不支持存储嵌套结构,导出前必须先把嵌套列处理成每行对应单个值的普通列。
解决步骤
- 第一步:提取目标数据框,检查
price列的结构
df2 <- Coins_list$data # 查看price列每一行存储的元素个数 sapply(df2$price, length)
- 第二步:根据结构选择对应处理方式
- 如果上一步输出每一行的元素长度都是1,说明只是列类型不对,直接转成普通数值向量即可:
df2$price <- as.numeric(df2$price) # 导出时加row.names=FALSE可以避免导出无意义的行号列 write.csv(df2, file = "Coins_list_full_data.csv", row.names = FALSE) - 如果每一行元素长度大于1(比如存储了多时间点的价格、嵌套了多列数据),需要先把嵌套结构展开为规范二维表,推荐用
tidyr包的unnest函数处理:# 首次使用先安装tidyverse工具包 install.packages("tidyverse") library(tidyverse) # 自动展开嵌套的price列,嵌套的向量/小数据框会被拆分为规范的行/列 df_flat <- df2 %>% unnest(price) # 导出处理好的规范表格 write.csv(df_flat, file = "Coins_list_full_data.csv", row.names = FALSE)
- 如果上一步输出每一行的元素长度都是1,说明只是列类型不对,直接转成普通数值向量即可:
补充:如果你确认每一行的price向量里仅第一个值是有效目标值,也不需要展开全量嵌套数据,直接用下面代码提取每行第一个值转为普通数值向量,再导出即可:
df2$price <- sapply(df2$price, `[`, 1) write.csv(df2, file = "Coins_list_full_data.csv", row.names = FALSE)
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

