1. R中加执行进度条
library(tidyverse)
library(cli)
 
set.seed(123)
 
# ===== 1. 生成模拟数据并保存到 data_dir =====
dir.create("data_dir", showWarnings = FALSE)
 
# 模拟 5 组差异分析结果文件
for (i in 1:5) {
    gene_ids <- paste0("gene", sample(1:15, 10))  # 每组随机10个基因
    df <- tibble(
        gene_id = gene_ids,
        !!paste0("log2FC_group", i) := rnorm(10, mean = 0, sd = 2),
        !!paste0("padj_group", i) := runif(10, min = 0, max = 1)
    )
    
    write_tsv(df, file.path("data_dir", paste0("DE_group", i, ".tsv")))
}
 
# ===== 2. 获取文件列表 =====
files <- list.files("data_dir", pattern = "\\.tsv$", full.names = TRUE)
 
# ===== 3. 进度条读取文件 =====
cli_progress_bar("Merging DE results", total = length(files), .envir = .GlobalEnv)
 
all_results <- walk(files, ~ {
    Sys.sleep(1)  # 模拟耗时
    read_tsv(.x, show_col_types = FALSE)
    cli_progress_update(inc = 1, .envir = .GlobalEnv)
})
 
cli_progress_done(.envir = .GlobalEnv)
 
  1. 合并多个数据框?
library(dplyr)
library(purrr)
 
# 构造示例数据
df1 <- data.frame(
    gene_id = c("geneA", "geneB", "geneC"),
    expr_1 = c(5.2, 3.4, 2.1)
)
 
df2 <- data.frame(
    gene_id = c("geneA", "geneB", "geneD"),
    expr_2 = c(6.1, 2.9, 4.4)
)
 
df3 <- data.frame(
    gene_id = c("geneA", "geneC", "geneD"),
    expr_3 = c(7.3, 3.8, 1.9)
)
 
# 放入列表
datas <- list(df1, df2, df3)
 
# 合并所有数据框,按 gene_id 对齐(full join)
merged_df <- reduce(datas, ~ merge(.x, .y, by = "gene_id", all = F))
  1. 如何对gene名重复的值取均值?
 
# 创建示例数据框
df <- data.frame(
    Gene_name = c("GeneA", "GeneA", "GeneB", "GeneB", "GeneC", "GeneC"),
    Sample1 = c(10.2, 11.5, 5.3, 5.8, 7.1, 7.0),
    Sample2 = c(8.7, 9.2, 6.1, 6.0, 5.9, 6.2),
    Sample3 = c(12.1, 11.8, 4.9, 5.2, 8.3, 8.0),
    stringsAsFactors = FALSE
)
 
# 查看原始数据
print(df)
 
 
expr_merged <- df %>%
    group_by(Gene_name) %>%
    summarise(across(everything(), mean))
 
 
  1. 如何对gene表达量的值取log2?
# 创建示例数据框
expr <- data.frame(
    Gene = c("TP53", "MYC", "EGFR", "TP53", "MYC"),
    Sample1 = c(100, 250, 50, 110, 230),
    Sample2 = c(80, 300, 40, 90, 280),
    Sample3 = c(120, 200, 60, 130, 210),
    stringsAsFactors = FALSE
)
 
# 查看原始数据
print(expr)
 
library(dplyr)
 
# 对表达值进行log2(x+1)转换
log2_df <- expr %>% 
    mutate(across(where(is.numeric), ~ log2(. + 1)))
 
# 查看转换后的数据
print(log2_df)
  1. compact的用法 如何去除列表中的NULL元素
library(purrr)
 
# 生成一个带 NULL 的列表
res <- map(1:5, ~ if (.x %% 2 == 0) NULL else .x)
 
# 去除 NULL
compact(res)
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 3
#> 
#> [[3]]
#> [1] 5