- 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)
- 合并多个数据框?
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))
- 如何对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))
- 如何对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)
- 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