如何在R中读取未知数量与名称的Parquet文件并生成以文件名命名的列表
在R中读取多个Parquet文件并生成命名列表
我来帮你搞定这个问题~你之前的代码报错,核心原因是你用c()初始化的是原子向量,而R的原子向量没办法存储数据框这种复杂对象,所以赋值的时候就会出现"替换的项目数量不是替换长度的倍数"的错误。下面给你两种靠谱的解决方法:
方法1:修改你的循环逻辑
只需要把初始化的对象改成列表,并且用双重方括号给列表元素赋值就行:
library("arrow") # 可以手动指定文件名,也可以自动获取目录下的文件 file_names = c('a.parquet', 'B.parquet') # 初始化空列表,而非向量 daten <- list() for (pf in file_names) { # 提取去掉后缀的文件名作为列表元素名 df_name <- strsplit(pf, ".", fixed=TRUE)[[1]][1] df <- arrow::read_parquet(pf) # 用双重方括号给命名列表元素赋值 daten[[df_name]] <- df }
循环结束后,daten就是你想要的命名列表,比如用daten[["a"]]就能直接访问第一个文件对应的数据集。
方法2:更简洁的R风格写法(推荐)
用lapply可以省去手动写循环的麻烦,代码更简洁高效,还能自动批量处理文件:
library(arrow) # 自动获取当前目录下所有Parquet文件(如果需要指定目录,修改path参数即可) file_names <- list.files(path = ".", pattern = "\\.parquet$", full.names = FALSE) # 读取所有文件并生成列表 all_data <- lapply(file_names, function(file) { arrow::read_parquet(file) }) # 给列表元素设置名称(去掉文件后缀) names(all_data) <- sapply(file_names, function(file) { strsplit(file, ".", fixed = TRUE)[[1]][1] })
如果觉得处理文件名后缀的代码有点繁琐,可以用fs包的path_ext_remove函数,一行搞定后缀去除:
library(fs) names(all_data) <- path_ext_remove(file_names)
验证结果
运行完代码后,你可以用names(all_data)查看所有列表元素的名称,用all_data[["你的文件名"]]直接访问对应的数据框,完全符合你的需求~
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

