R语言如何简化初始化带名称的data.frame列表并批量导出数据集
解决方案
你之前的初始化写法无效是因为在
list()内用了<-赋值运算符,没有给列表元素指定名称,所以无法通过names()获取到标识。列表的命名参数格式为list(名称 = 值),通过批量设置名称的方式可以避免逐个写参数的繁琐。
1 批量初始化带名称的数据集列表
你不需要逐个定义数据集再存入列表,直接通过名称向量批量生成带命名的列表即可:
首先先定义你的默认data.frame:
dataset_default <- data.frame(a = as.character(), b = as.character())
基础R实现
第一步先定义所有数据集的名称,存入字符向量:
- 如果是自定义无规律名称:
# 按你的需求填入30个数据集的名称即可 names_vec <- c("first", "second", "third", ... , "thirtieth")
- 如果是有规律的名称(比如
ds1到ds30),可以直接批量生成,不需要手打:
names_vec <- paste0("ds", 1:30)
第二步一行代码生成带命名的数据集列表:
list_of_datasets <- setNames( replicate(length(names_vec), dataset_default, simplify = FALSE), names_vec )
执行完成后names(list_of_datasets)就能直接拿到所有数据集的名称,后续你可以按索引或者名称修改对应数据集的内容,不同数据集之间修改互不影响。
tidyverse实现(可选)
如果习惯用tidyverse生态,也可以用purrr::map实现,逻辑和基础R一致:
library(purrr) names_vec <- paste0("ds", 1:30) list_of_datasets <- map(names_vec, ~dataset_default) %>% set_names(names_vec)
2 批量导出数据集
先提前创建输出目录避免报错:
dir.create("mydata", showWarnings = FALSE, recursive = TRUE)
基础R实现
直接遍历列表的名称拼接路径即可:
for (ds_name in names(list_of_datasets)) { write_tsv( x = list_of_datasets[[ds_name]], file = file.path("mydata", paste0(ds_name, ".tsv")) ) }
如果用glue包拼接路径写法更直观,和你想要的{nameofdataframe}格式完全一致:
library(glue) for (ds_name in names(list_of_datasets)) { write_tsv(list_of_datasets[[ds_name]], glue("mydata/{ds_name}.tsv")) }
tidyverse实现(可选)
用purrr::iwalk可以更简洁的实现遍历,.x对应列表元素(数据集),.y对应列表元素的名称:
library(purrr) library(glue) iwalk(list_of_datasets, ~write_tsv(.x, glue("mydata/{.y}.tsv")))
内容的提问来源于stack exchange,提问作者JorgeHB
相关产品推荐
相关产品推荐

