Skip to content

Commit 5a549b6

Browse files
committed
Initial commit
0 parents  commit 5a549b6

341 files changed

Lines changed: 62314 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.DS_Store

6 KB
Binary file not shown.

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Auto detect text files and perform LF normalization
2+
* text=auto

rmarkdown-fundamentals/.DS_Store

6 KB
Binary file not shown.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"hash": "54b5e641b087b41b5d91d79ee52e7881",
3+
"result": {
4+
"engine": "knitr",
5+
"markdown": "---\ntitle: \"实验1:R基础编程\"\nsubtitle: \"掌握R语言核心语法与数据处理\"\n---\n\n## 实验目标\n\n完成本实验后,你将能够:\n\n1. 熟练创建和操作R的各种数据结构\n2. 使用控制流语句解决实际问题\n3. 编写自定义函数封装重复代码\n4. 进行基础的数据处理与分析\n\n**实验时长**:60分钟 \n**实验类型**:个人完成\n\n---\n\n## 实验准备\n\n### 环境要求\n\n- R >= 4.3.0\n- RStudio >= 2023.06\n\n### 创建新项目\n\n1. 打开RStudio\n2. 菜单:File → New Project → New Directory → New Project\n3. 目录名:`lab1-r-basics`\n4. 勾选 `Create a git repository`(如果有Git)\n\n### 创建脚本文件\n\n在RStudio中,创建新脚本:`File → New File → R Script`,保存为 `lab1.R`\n\n---\n\n## 第一部分:数据类型与结构 (20分钟)\n\n### 练习1.1:基础类型\n\n在R脚本中完成以下操作:\n\n```r\n# TODO: 创建以下变量\n# 1. 一个数值型变量,值为 3.14159,命名为 pi_val\n# 2. 一个整型变量,值为 100,命名为 n_samples \n# 3. 一个字符型变量,值为 \"Biomedical Informatics\",命名为 dept_name\n# 4. 一个逻辑型变量,值为 TRUE,命名为 is_student\n\n# 你的代码:\n\n\n\n\n# 使用 class() 函数检查每个变量的类型\n\n```\n\n::: {.hint-box}\n**提示**:使用 `L` 后缀创建整数,如 `100L`\n:::\n\n---\n\n### 练习1.2:向量操作\n\n```r\n# TODO: 完成以下向量操作\n\n# 1. 创建一个包含 1 到 20 的向量,命名为 vec1\nvec1 <- ____\n\n# 2. 创建 seq() 生成 0 到 100、步长为 10 的向量\nvec2 <- ____\n\n# 3. 用 rep() 创建 \"A\", \"B\", \"C\" 各重复3次的向量\nvec3 <- ____\n\n# 4. 计算 vec1 的平均值、标准差、最大值\nmean_val <- ____\nsd_val <- ____\nmax_val <- ____\n\n# 5. 提取 vec1 中大于10的元素\nvec1_large <- ____\n\n# 6. 将 vec1 的第 5 到第 10 个元素替换为 99\nvec1[____] <- ____\n```\n\n---\n\n### 练习1.3:数据框创建\n\n创建一个患者信息数据框:\n\n```r\n# TODO: 创建如下数据框\n# 患者ID: 101, 102, 103, 104, 105\n# 姓名: 张三, 李四, 王五, 赵六, 孙七\n# 年龄: 25, 34, 45, 28, 52\n# 性别: 男, 女, 男, 女, 男\n# 收缩压: 120, 135, 142, 118, 155\n\npatients <- data.frame(\n # 你的代码:\n \n \n \n \n \n)\n\n# 查看数据框结构\nstr(patients)\n\n# 查看摘要统计\nsummary(patients)\n```\n\n---\n\n### 练习1.4:数据框操作\n\n```r\n# TODO: 基于上题的 patients 数据框\n\n# 1. 提取所有女性患者的信息\nfemale_patients <- ____\n\n# 2. 提取年龄大于40岁的患者姓名\nolder_names <- ____\n\n# 3. 计算所有患者的平均年龄\navg_age <- ____\n\n# 4. 找出收缩压最高的患者ID\nhigh_bp_id <- ____\n\n# 5. 添加一列 \"风险等级\":收缩压>=140为\"高\",否则为\"正常\"\npatients$risk <- ifelse(____, ____, ____)\n```\n\n::: {.hint-box}\n**提示**:\n- 条件筛选使用 `data[condition, ]`\n- `which.max()` 可以找到最大值的位置\n:::\n\n---\n\n## 第二部分:控制流 (15分钟)\n\n### 练习2.1:BMI计算与分类\n\n完成BMI计算函数:\n\n```r\n# TODO: 完善以下函数\ncalculate_bmi <- function(weight_kg, height_m) {\n # 1. 计算BMI\n bmi <- ____\n \n # 2. 根据BMI判断分类\n # < 18.5: 偏瘦\n # 18.5 - 23.9: 正常\n # 24 - 27.9: 超重\n # >= 28: 肥胖\n if (____) {\n category <- \"偏瘦\"\n } else if (____) {\n category <- \"正常\"\n } else if (____) {\n category <- \"超重\"\n } else {\n category <- \"肥胖\"\n }\n \n # 3. 返回列表\n return(list(\n bmi = round(bmi, 2),\n category = category\n ))\n}\n\n# 测试函数\ncalculate_bmi(70, 1.75)\ncalculate_bmi(55, 1.60)\ncalculate_bmi(85, 1.70)\n```\n\n---\n\n### 练习2.2:循环应用\n\n```r\n# TODO: 使用循环完成以下任务\n\n# 1. 用 for 循环计算 1 到 100 的平方和\nsum_squares <- 0\nfor (____) {\n ____\n}\nsum_squares\n\n# 验证:使用向量化方法\nsum((1:100)^2)\n\n# 2. 用 while 循环找出第一个大于 1000 的斐波那契数\nfib_a <- 1\nfib_b <- 1\nwhile (____) {\n temp <- fib_a + fib_b\n fib_a <- fib_b\n fib_b <- temp\n}\nfib_b # 第一个大于1000的斐波那契数\n\n# 3. 用循环计算 patients 数据框中每个患者的BMI\n# 假设体重数据如下(kg):\npatients$weight <- c(65, 58, 72, 55, 80)\npatients$height <- c(1.70, 1.60, 1.75, 1.58, 1.72)\n\n# 初始化BMI列\npatients$bmi <- NA\n\nfor (____) {\n patients$bmi[i] <- ____\n}\n\npatients\n```\n\n---\n\n## 第三部分:综合应用 (20分钟)\n\n### 练习3.1:基因表达分析\n\n假设你有一个基因表达矩阵:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# 基因表达数据(行:基因,列:样本)\ngene_exp <- data.frame(\n gene_id = c(\"TP53\", \"BRCA1\", \"EGFR\", \"MYC\", \"KRAS\"),\n sample1 = c(12.5, 8.3, 15.2, 20.1, 6.7),\n sample2 = c(11.8, 9.1, 14.5, 19.3, 7.2),\n sample3 = c(13.2, 7.9, 16.1, 21.5, 6.1),\n sample4 = c(10.5, 8.7, 13.8, 18.2, 7.8)\n)\n\nprint(gene_exp)\n```\n\n::: {.cell-output .cell-output-stdout}\n\n```\n gene_id sample1 sample2 sample3 sample4\n1 TP53 12.5 11.8 13.2 10.5\n2 BRCA1 8.3 9.1 7.9 8.7\n3 EGFR 15.2 14.5 16.1 13.8\n4 MYC 20.1 19.3 21.5 18.2\n5 KRAS 6.7 7.2 6.1 7.8\n```\n\n\n:::\n:::\n\n\n**任务**:\n\n```r\n# TODO: 完成以下分析任务\n\n# 1. 创建一个函数,计算每行(基因)的:\n# - 平均表达量\n# - 表达量标准差\n# - 变异系数 (CV = SD / Mean)\nanalyze_gene <- function(exp_values) {\n # 你的代码:\n \n}\n\n# 2. 对所有基因应用该函数,结果保存为新数据框\ngene_summary <- data.frame(\n gene_id = gene_exp$gene_id,\n mean_exp = NA,\n sd_exp = NA,\n cv = NA\n)\n\nfor (i in 1:nrow(gene_exp)) {\n result <- analyze_gene(____)\n gene_summary$mean_exp[i] <- ____\n gene_summary$sd_exp[i] <- ____\n gene_summary$cv[i] <- ____\n}\n\ngene_summary\n\n# 3. 找出平均表达量最高的基因\nmost_expressed <- ____\n\n# 4. 找出变异系数最大的基因(表达最不稳定)\nmost_variable <- ____\n```\n\n---\n\n### 练习3.2:质控过滤\n\n```r\n# TODO: 基于 gene_summary 进行过滤\n\n# 1. 过滤条件:\n# - 平均表达量 >= 10\n# - 变异系数 <= 0.15\n# 保留满足条件的基因\n\nfiltered_genes <- gene_summary[____, ]\nfiltered_genes\n\n# 2. 统计满足条件的基因数量\ncat(\"原始基因数:\", nrow(gene_summary), \"\\n\")\ncat(\"过滤后基因数:\", ____, \"\\n\")\ncat(\"过滤比例:\", ____, \"%\\n\")\n```\n\n---\n\n### 练习3.3:临床数据整合\n\n```r\n# 新的临床数据\nclinical <- data.frame(\n patient_id = c(101, 102, 103, 104, 105),\n diagnosis = c(\"Control\", \"Case\", \"Case\", \"Control\", \"Case\"),\n age = c(25, 34, 45, 28, 52),\n treatment = c(\"Placebo\", \"Drug\", \"Drug\", \"Placebo\", \"Drug\")\n)\n\n# 将 patients 与 clinical 合并\n# 注意:patients 中的ID列可能需要调整\n\n# TODO:\n# 1. 重命名 patients 的ID列以便匹配\nnames(patients)[____] <- \"patient_id\"\n\n# 2. 使用 merge() 合并两个数据框\nmerged_data <- merge(____, ____, by = ____)\n\n# 3. 按 diagnosis 分组,计算平均年龄\n# 提示:使用 aggregate() 或手动计算\ncontrol_mean_age <- mean(____)\ncase_mean_age <- mean(____)\n\ncat(\"Control组平均年龄:\", control_mean_age, \"\\n\")\ncat(\"Case组平均年龄:\", case_mean_age, \"\\n\")\n\n# 4. 筛选出Case组且年龄>40的患者\ncase_older <- ____\ncase_older\n```\n\n---\n\n## 第四部分:拓展挑战 (5分钟)\n\n### 挑战题:批量处理\n\n```r\n# 批量读取多个样本的数据文件\n# 假设你有文件: sample1.txt, sample2.txt, sample3.txt\n\n# TODO: 编写代码批量读取并合并\n\n# 1. 创建一个函数,读取单个样本文件\n# 格式:两列,gene 和 expression\nread_sample <- function(filename, sample_name) {\n # 读取数据\n data <- read.table(filename, header = TRUE, sep = \"\\t\")\n # 重命名表达列为样本名\n names(data)[2] <- sample_name\n return(data)\n}\n\n# 2. 使用循环批量读取多个样本并合并\n# (模拟数据)\nsample_files <- c(\"sample1\", \"sample2\", \"sample3\")\ncombined_data <- NULL\n\nfor (file in sample_files) {\n # 模拟读取\n temp_data <- data.frame(\n gene = c(\"TP53\", \"BRCA1\", \"EGFR\"),\n expression = runif(3, 5, 20)\n )\n names(temp_data)[2] <- file\n \n if (is.null(combined_data)) {\n combined_data <- temp_data\n } else {\n combined_data <- merge(combined_data, temp_data, by = \"gene\")\n }\n}\n\ncombined_data\n```\n\n---\n\n## 实验提交\n\n### 提交内容\n\n1. **R脚本文件** (`lab1.R`)\n - 包含所有练习的代码\n - 添加必要注释\n\n2. **实验报告** (PDF或HTML)\n - 使用R Markdown编写\n - 包含关键代码和结果截图\n - 回答思考题\n\n### 评分标准\n\n| 项目 | 分值 | 说明 |\n|------|:----:|------|\n| 完成度 | 60分 | 所有练习完成 |\n| 代码质量 | 20分 | 规范、有注释 |\n| 报告质量 | 15分 | 清晰、完整 |\n| 拓展挑战 | 5分 | 选做 |\n\n---\n\n## 思考题\n\n1. **向量化 vs 循环**\n - 为什么R中向量化操作通常比循环更快?\n - 在什么情况下必须使用循环?\n\n2. **数据类型选择**\n - data.frame 和 matrix 的主要区别是什么?\n - 什么时候应该使用 list?\n\n3. **函数设计**\n - 如何设计一个\"好\"的函数?\n - 参数命名有什么最佳实践?\n\n---\n\n## 参考答案\n\n<details>\n<summary>点击查看练习1.1答案</summary>\n\n```r\npi_val <- 3.14159\nn_samples <- 100L\ndept_name <- \"Biomedical Informatics\"\nis_student <- TRUE\n\nclass(pi_val)\nclass(n_samples)\nclass(dept_name)\nclass(is_student)\n```\n</details>\n\n<details>\n<summary>点击查看练习1.2答案</summary>\n\n```r\nvec1 <- 1:20\nvec2 <- seq(0, 100, by = 10)\nvec3 <- rep(c(\"A\", \"B\", \"C\"), each = 3)\n\nmean_val <- mean(vec1)\nsd_val <- sd(vec1)\nmax_val <- max(vec1)\n\nvec1_large <- vec1[vec1 > 10]\nvec1[5:10] <- 99\n```\n</details>\n\n<details>\n<summary>点击查看练习1.3答案</summary>\n\n```r\npatients <- data.frame(\n id = 101:105,\n name = c(\"张三\", \"李四\", \"王五\", \"赵六\", \"孙七\"),\n age = c(25, 34, 45, 28, 52),\n gender = c(\"男\", \"女\", \"男\", \"女\", \"男\"),\n bp = c(120, 135, 142, 118, 155),\n stringsAsFactors = FALSE\n)\n```\n</details>\n\n---\n\n## 延伸阅读\n\n- [R for Data Science - Chapter 5](https://r4ds.had.co.nz/transform.html)\n- [Advanced R - Data Structures](https://adv-r.hadley.nz/vectors-chap.html)\n- [R Programming for Data Science](https://bookdown.org/rdpeng/rprogdatascience/)\n\n---\n\n**实验结束,祝学习愉快!** 🎉\n",
6+
"supporting": [],
7+
"filters": [
8+
"rmarkdown/pagebreak.lua"
9+
],
10+
"includes": {},
11+
"engineDependencies": {},
12+
"preserve": {},
13+
"postProcess": true
14+
}
15+
}

0 commit comments

Comments
 (0)