如何在R中创建适配特定层级文件夹结构的指定格式数据读取函数?
R函数实现指定区域的msoa数据读取与抽样
下面是符合你需求的函数实现,已经考虑了重复编码、跨文件夹存在同一msoa的情况,同时支持全量读取或按rgn/lad/msoa筛选,还能随机抽样:
helper <- function(df = NULL, rgn = NULL, lad = NULL, msoa = NULL, percent = NULL) { # 优先使用传入的df,无传入则读取文件 if (!is.null(df)) { data <- df } else { # 构建文件搜索规则 path_pattern <- if (!is.null(msoa)) { # 按msoa编码递归搜索所有匹配文件 file.path("**", paste0(msoa, ".Rdata")) } else if (!is.null(lad)) { # 按lad查找,指定rgn则限定路径范围 rgn_path <- if (!is.null(rgn)) file.path(rgn, lad) else file.path("**", lad) file.path(rgn_path, "msoa.Rdata") } else if (!is.null(rgn)) { # 按rgn读取所有下属lad的msoa数据 file.path(rgn, "**", "msoa.Rdata") } else { # 无区域参数,读取所有msoa.Rdata file.path("**", "msoa.Rdata") } # 获取匹配的文件路径 file_paths <- list.files(path = ".", pattern = path_pattern, recursive = TRUE, full.names = TRUE) if (length(file_paths) == 0) { stop("未找到匹配的msoa.Rdata文件,请检查参数或文件夹结构") } # 批量读取文件并合并 data_list <- lapply(file_paths, function(path) { load(path) # 假设加载后的数据对象名为msoa_data,若实际名称不同请修改此处 return(msoa_data) }) data <- do.call(rbind, data_list) # 按msoa编码去重(假设数据含msoa_code列,需根据实际列名调整) if ("msoa_code" %in% colnames(data)) { data <- data[!duplicated(data$msoa_code), ] } else { warning("未找到msoa_code列,无法自动去重,请手动处理重复数据") } } # 执行随机抽样 if (!is.null(percent)) { if (percent < 0 || percent > 1) { stop("percent参数必须在0到1之间") } sample_idx <- sample(nrow(data), floor(nrow(data) * percent)) data <- data[sample_idx, ] } return(data) }
关键逻辑说明
- 路径匹配:
- 指定
msoa编码时,递归搜索所有文件夹下对应编码的文件,解决同一msoa存于不同lad的问题 - 指定
lad时,可搭配rgn缩小范围,否则会遍历所有rgn下的目标lad文件夹 - 无区域参数时,读取所有层级的
msoa.Rdata
- 指定
- 去重处理:默认按
msoa_code列去重,若你的数据编码列名不同,记得修改代码中对应字段 - 抽样功能:
percent接受0-1之间的数值,比如percent=0.3就是随机抽取30%的数据 - 兼容传入数据框:如果已有加载好的
df,直接传入即可跳过文件读取步骤
使用示例
# 读取所有msoa数据并抽取20%样本 all_sample <- helper(percent = 0.2) # 读取指定rgn(E12000007)下的所有lad数据 rgn_data <- helper(rgn = "E12000007") # 读取指定lad下的msoa数据并去重 lad_data <- helper(lad = "E09000001") # 读取指定msoa编码的所有数据 msoa_data <- helper(msoa = "E00012345")
内容的提问来源于stack exchange,提问作者Fredie Didier
相关产品推荐
相关产品推荐

