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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:22:15