xiaotu9316 2024-05-30 16:15 采纳率: 88.6%
浏览 3
已结题

按excel内的指定内容,从多个csv中读取需要的数据,生成一个新的excel

按excel内的指定内容,从多个csv中读取需要的数据,生成一个新的excel:

一、当前文件夹如下:
包括5个文件:
1.MR_GCST90255375.csv(简称表1)
2.MR_R10_K11_ACUTPANC.csv(简称表2)
meta初步表.xlsx
阳性结果表_初步合并及整理.xlsx
阳性结果表_阳性暴露及研究.xlsx

img


二、根据“阳性结果表_阳性暴露及研究.xlsx”中的“id.exposure”列的内容,分别从“1.MR_GCST90255375.csv“,“2.MR_R10_K11_ACUTPANC.csv“中提取指定的数据。
阳性结果表_阳性暴露及研究.xlsx内容如下:

img


1.MR_GCST90255375.csv内容如下(2.MR_R10_K11_ACUTPANC.csv表头相同):

img


三、生成的结果表如下:
0、Exposure列的值:为“阳性结果表_阳性暴露及研究.xlsx”表中“id.exposure”列的值;如有重复值,在提取后删除重复值。
1、study列的值:为所提取表(表1或表2)的文件名“”MR_”后的内容
2、Cases列的值:为指定数值(study为GCST90255375的,值为123,study为R10_K11_ACUTPANC,值为456)
3、Noncases列的值:为指定数值(study为GCST90255375的,值为789,study为R10_K11_ACUTPANC,值为1011)
4、“OR“列的值:对应study表(表1或表2)内:id.exposure行与“or”列的交叉单元格值
5、“or_lci95“列的值:对应study表(表1或表2)内:id.exposure行与“or_lci95”列的交叉单元格值
6、“or_uci95“列的值:对应study表(表1或表2)内:id.exposure行与“or_uci95”列的交叉单元格值
7、“P“列的值:对应study表(表1或表2)内:id.exposure行与“pval”列的交叉单元格值
8、以上内容,按生成表的A列("Exposure")扩展排序,排序后A列相同的值在一起

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-30 16:15
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个任务,你需要安装并加载几个R语言的包,例如readxl, tidyverse, 和 janitor。首先,确保这些包已经安装,如果没有,请运行以下命令进行安装:

    install.packages(c("readxl", "tidyverse", "janitor"))
    

    接下来,按照以下步骤操作:

    1. 读取Excel文件中的元数据信息。
    2. 根据元数据找到对应的CSV文件。
    3. 读取CSV文件,并根据需要的列进行筛选。
    4. 将所有数据整合到一个DataFrame中。
    5. 处理重复的曝光ID。
    6. 添加固定的案例和非案例计数。
    7. 按照 Exposure 排序并输出到新的Excel文件。

    下面是完成此任务的完整R代码:

    # 加载所需的库
    library(readxl)
    library(tidyverse)
    library(janitor)
    
    # 读取元数据表
    meta_data <- read_excel("meta初步表.xlsx")
    
    # 定义函数用于查找并读取CSV文件
    find_and_read_csv <- function(file_name) {
      csv_path <- file.path(".", gsub("\\.xlsx$", ".csv", file_name))
      if (file.exists(csv_path)) {
        return(read.csv(csv_path, header = TRUE, stringsAsFactors = FALSE))
      } else {
        stop(paste0("CSV 文件 ", csv_path, " 不存在。"))
      }
    }
    
    # 从元数据中获取CSV文件列表
    csv_files <- meta_data %>% 
      filter(type == "Microsoft Excel 逗号分隔值文件") %>% 
      pull(name)
    
    # 初始化最终数据框
    final_df <- data.frame()
    
    # 对于每个CSV文件,提取所需数据并添加到最终数据框
    for (csv_file in csv_files) {
      csv_data <- find_and_read_csv(csv_file)
      
      # 提取特定列
      selected_data <- csv_data %>%
        select(id.exposure, or, or_lci95, or_uci95, pval) %>%
        janitor::clean_names()
      
      # 创建 study 列
      selected_data$study <- sub("MR_", "", csv_file)
      
      # 添加固定案例和非案例计数
      cases <- ifelse(selected_data$study == "GCST90255375", 123, 456)
      non_cases <- ifelse(selected_data$study == "GCST90255375", 789, 1011)
      selected_data$cases <- cases
      selected_data$non_cases <- non_cases
      
      final_df <- bind_rows(final_df, selected_data)
    }
    
    # 去除重复的曝光ID
    final_df <- unique(final_df)
    
    # 按 Exposure 排序并输出到新Excel文件
    write_xlsx(final_df, "result.xlsx", sheet_name = "Results")
    

    这段代码会创建一个名为“result.xlsx”的Excel文件,其中包含按 Exposure 排序的结果表。如果你想要在不同的工作表中保存结果,请将sheet_name参数更改为所需的名称。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 创建了问题 5月30日