🔧 tool

R语言基本语法

**变量和数据类型:** ```r # 赋值(推荐使用 <-) x <- 42 y <- 3.14 name <- "GeneA" is_active <- TRUE # 向量(最基本的数据结构) expr_values <- c(10.5, 23.4, 5.2, 18.9, 12.1) genes <- c("BRCA1", "TP53", "EGFR", "MYC") # 向量操作 lengt...

📖 定义

变量和数据类型:

# 赋值(推荐使用 <-)
x <- 42
y <- 3.14
name <- "GeneA"
is_active <- TRUE
# 向量(最基本的数据结构)
expr_values <- c(10.5, 23.4, 5.2, 18.9, 12.1)
genes <- c("BRCA1", "TP53", "EGFR", "MYC")
# 向量操作
length(expr_values)
mean(expr_values)
sd(expr_values)
summary(expr_values)
# 数据框(类似Excel表格)
df <- data.frame(
    gene = c("BRCA1", "TP53", "EGFR", "MYC"),
    expression = c(25.3, 18.7, 12.4, 8.9),
    group = c("treatment", "treatment", "control", "control")
)
# 访问数据
df$gene                    # 提取列
df$expression
df[1, ]                    # 第一行
df[, "expression"]         # 按名列
df[df$group == "treatment", ]  # 条件筛选
# 列表(可包含不同类型)
my_list <- list(
    name = "sample1",
    counts = c(100, 200, 300),
    metadata = data.frame(key = c("A", "B"), val = c(1, 2))
)
my_list$name
my_list[["counts"]]

控制流:

# 条件语句
x <- 15
if (x > 10) {
    print("x is greater than 10")
} else if (x > 5) {
    print("x is between 5 and 10")
} else {
    print("x is 5 or less")
}
# ifelse向量化条件
scores <- c(85, 92, 78, 65, 88)
grades <- ifelse(scores >= 90, "A",
                 ifelse(scores >= 80, "B",
                        ifelse(scores >= 70, "C", "D")))
# for循环
for (gene in genes) {
    print(paste("Processing:", gene))
}
# apply族函数(向量化操作,避免显式循环)
# apply用于矩阵/数组
# lapply用于列表,返回列表
# sapply用于列表,返回向量/矩阵
# tapply用于分组计算
# 示例:对数据框的数值列计算均值
numeric_cols <- sapply(df, is.numeric)
lapply(df[, numeric_cols], mean)

函数:

# 定义函数
calculate_fold_change <- function(treatment, control) {
    """计算差异倍数(log2 fold change)"""
    fc <- treatment - control  # 假设已经是log2转换的值
    return(fc)
}
# 使用
fc <- calculate_fold_change(10.5, 8.2)
print(paste("Fold change:", round(fc, 2)))
# 默认参数
normalize <- function(values, method = "zscore") {
    if (method == "zscore") {
        return((values - mean(values)) / sd(values))
    } else if (method == "minmax") {
        return((values - min(values)) / (max(values) - min(values)))
    } else {
        stop("Unknown normalization method")
    }
}