生物信息学

2.2 生信编程语言导览




桂松涛 Blog
songtaogui@163.com


适用于生物数据分析的编程语言

两语言问题

适用于生物数据分析的编程语言

两语言问题

适用于生物数据分析的编程语言


生信常用语言

  • Shell(Bash): 批处理, 简单流程管理, 作业调度;

  • Perl: 文本操作, 随写随用, 曾经的生信天花板, 现今老年人象征;

  • R: 生态强悍, 统计分析, 原型开发, 数据可视化;

  • Python: 大型应用开发, 生态强悍, Perl/R能做的都能做, 调包侠;

  • Rust/C/C++/GO/Java...: 系统编程、开发性能优化的工具;

  • Julia: 理念先进, 两语言问题的现行解决方案, 但没有金主, 用爱发电, 生态不够, 中文资料等于没有😔;


新入坑推荐路线

  • Shell(Bash) + R <- 新手强推

  • Shell(Bash) + Python <- 新手普通推(带偏见)

  • Shell(Bash) + Perl + R <- Here I am

  • Shell(Bash) + Julia <- My future


编程语言通用概念概览



基础概念

  • 入门概念

  • 变量

  • 数据类型

  • 运算符

  • 函数

  • 流程控制

  • 包/模块

  • ...

进阶概念

  • 变量作用域

  • 模式匹配: 正则表达式

  • 元编程

  • 并行编程, 异步编程

  • 网络和流

  • 编程范式

  • 设计模式

  • ...


编程语言通用基础: 入门概念




  • 交互式会话(REPL)

  • 命令行工具

  • 脚本

  • 包/项目


编程语言通用基础: 变量


变量: 与某个值相关联的名字, 保存一个值, 以供后续代码使用。

# 将 10 赋值给变量x
x = 10

# 使用x进行计算
x + 1

# 重新赋值x
x = 1 + 1
x = "Hello SDAU"

# 变量名
# - 变量名必须以字母、数字、下划线_和句点.组成
# - 变量名的第一个字符不能为数字或者特殊符号
# - 大小写敏感
x=1
X=2
1y=3 # oops!


编程语言通用基础: 数据类型


# 整数Int (Integer)
10, -1, 0

# 浮点数Float
1.2, 0.3, 5.5

# 字符串
"abc", "123", "登高必自"

# 数组 (array), 向量 (vector), 列表(list)
[1,2,3,4]
["a", "b", "c", "d"]
# 混合元素的数组(嵌套数组)
[
    1,
    "a",
    [3, 4],
    "b"
] # 在R中是 列表(list)


# 字典, 哈希表 (在R语言中, 是具名数组, 或具名列表)
dd = Dict(
    # Key => Value, 键 => 值,
    "name"   => "ST.Gui",
    "age"    => 18,
    "height" => 185
)
dd["name"]

# 多维数组, 矩阵
julia> [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9


编程语言通用基础: 运算符


# 基础数学运算: +, -, *, /, ÷, %, ^
2 + 1
2 - 1
2 * 3
3 / 2
3 ÷ 2
3 % 2
2 ^ 3

# 数值比较: ==, !=, <, >, <=, >=

2 == 2
2 >= 1

# 布尔运算(逻辑运算): !, &&, ||

2 > 1 && 2 > 3
2 > 1 || 2 > 3
! (2 > 1)

# 位运算(超纲了, 略过):
# ~, &, |, \xor, \nand, \nor, >>>, >>, <<


编程语言通用基础: 函数


# 编程语言中的函数跟数学中的函数概念类似, y = f(x)
function my_add(x, y)
    x + y
end

my_add(1, 2)

# 可选参数和默认值
using Dates
function Date(y::Int64, m::Int64=1, d::Int64=1)
    err = validargs(Date, y, m, d)
    err === nothing || throw(err)
    return Date(UTD(totaldays(y, m, d)))
end

Date(2023, 10, 26)
Date(2023, 10)
Date(2023)

# 关键字参数
function plot(x, y; style="solid", width=1, color="black", delim=" <=> ")
    return join( [x, y, style, width, color], delim )
end

plot(1, 2)
plot(2, 1)
plot(1, 2, width=2)
plot(1, 2, color="red")


编程语言通用基础: 流程控制


# 判断: if-elseif-else; ?:(三元操作符)

if height > 190
    println("今天就到这吧, 我脖子疼")
elseif height > 170
    println("加个微信吧?")
else
    println("抱一丝, 我有对象了。")
end

score >= 60 ? println("及格了!") : println("不及格!")

# 循环: while; for
i = 1
while i <= 5
    println(i)
    i = i + 1
end

for j in ["a", "b", "c"]
    println(j)
end

# 超纲内容: 
## 异常处理(throw, try/catch)
## 循环结束后操作(finally)
## 提前退出(break, continue)


编程语言通用基础: 模块/包


# 加载别人已经写好的代码集合: 白嫖真香

# julia
using CSV
import CSV

# R
library(ggplot2)

# python
import os
from Branch import m3

# bash
source something.sh

# Perl
use List::Util


数据挖掘的基本数据类型


矩阵?     列表?     字典?     数据框(DataFrame)!

    

SepalLengthSepalWidthPetalLengthPetalWidthSpecies
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
4.63.41.40.3setosa
5.03.41.50.2setosa
4.42.91.40.2setosa
4.93.11.50.1setosa
5.43.71.50.2setosa
4.83.41.60.2setosa
4.83.01.40.1setosa
4.33.01.10.1setosa
5.84.01.20.2setosa
5.74.41.50.4setosa
5.43.91.30.4setosa
5.13.51.40.3setosa
5.73.81.70.3setosa
5.13.81.50.3setosa
5.43.41.70.2setosa
5.13.71.50.4setosa
4.63.61.00.2setosa
5.13.31.70.5setosa
4.83.41.90.2setosa
5.03.01.60.2setosa
5.03.41.60.4setosa
5.23.51.50.2setosa
5.23.41.40.2setosa
4.73.21.60.2setosa
4.83.11.60.2setosa
5.43.41.50.4setosa
5.24.11.50.1setosa
5.54.21.40.2setosa
4.93.11.50.2setosa
5.03.21.20.2setosa
5.53.51.30.2setosa
4.93.61.40.1setosa
4.43.01.30.2setosa
5.13.41.50.2setosa
5.03.51.30.3setosa
4.52.31.30.3setosa
4.43.21.30.2setosa
5.03.51.60.6setosa
5.13.81.90.4setosa
4.83.01.40.3setosa
5.13.81.60.2setosa
4.63.21.40.2setosa
5.33.71.50.2setosa
5.03.31.40.2setosa
7.03.24.71.4versicolor
6.43.24.51.5versicolor
6.93.14.91.5versicolor
5.52.34.01.3versicolor
6.52.84.61.5versicolor
5.72.84.51.3versicolor
6.33.34.71.6versicolor
4.92.43.31.0versicolor
6.62.94.61.3versicolor
5.22.73.91.4versicolor
5.02.03.51.0versicolor
5.93.04.21.5versicolor
6.02.24.01.0versicolor
6.12.94.71.4versicolor
5.62.93.61.3versicolor
6.73.14.41.4versicolor
5.63.04.51.5versicolor
5.82.74.11.0versicolor
6.22.24.51.5versicolor
5.62.53.91.1versicolor
5.93.24.81.8versicolor
6.12.84.01.3versicolor
6.32.54.91.5versicolor
6.12.84.71.2versicolor
6.42.94.31.3versicolor
6.63.04.41.4versicolor
6.82.84.81.4versicolor
6.73.05.01.7versicolor
6.02.94.51.5versicolor
5.72.63.51.0versicolor
5.52.43.81.1versicolor
5.52.43.71.0versicolor
5.82.73.91.2versicolor
6.02.75.11.6versicolor
5.43.04.51.5versicolor
6.03.44.51.6versicolor
6.73.14.71.5versicolor
6.32.34.41.3versicolor
5.63.04.11.3versicolor
5.52.54.01.3versicolor
5.52.64.41.2versicolor
6.13.04.61.4versicolor
5.82.64.01.2versicolor
5.02.33.31.0versicolor
5.62.74.21.3versicolor
5.73.04.21.2versicolor
5.72.94.21.3versicolor
6.22.94.31.3versicolor
5.12.53.01.1versicolor
5.72.84.11.3versicolor
6.33.36.02.5virginica
5.82.75.11.9virginica
7.13.05.92.1virginica
6.32.95.61.8virginica
6.53.05.82.2virginica
7.63.06.62.1virginica
4.92.54.51.7virginica
7.32.96.31.8virginica
6.72.55.81.8virginica
7.23.66.12.5virginica
6.53.25.12.0virginica
6.42.75.31.9virginica
6.83.05.52.1virginica
5.72.55.02.0virginica
5.82.85.12.4virginica
6.43.25.32.3virginica
6.53.05.51.8virginica
7.73.86.72.2virginica
7.72.66.92.3virginica
6.02.25.01.5virginica
6.93.25.72.3virginica
5.62.84.92.0virginica
7.72.86.72.0virginica
6.32.74.91.8virginica
6.73.35.72.1virginica
7.23.26.01.8virginica
6.22.84.81.8virginica
6.13.04.91.8virginica
6.42.85.62.1virginica
7.23.05.81.6virginica
7.42.86.11.9virginica
7.93.86.42.0virginica
6.42.85.62.2virginica
6.32.85.11.5virginica
6.12.65.61.4virginica
7.73.06.12.3virginica
6.33.45.62.4virginica
6.43.15.51.8virginica
6.03.04.81.8virginica
6.93.15.42.1virginica
6.73.15.62.4virginica
6.93.15.12.3virginica
5.82.75.11.9virginica
6.83.25.92.3virginica
6.73.35.72.5virginica
6.73.05.22.3virginica
6.32.55.01.9virginica
6.53.05.22.0virginica
6.23.45.42.3virginica
5.93.05.11.8virginica



数据挖掘的基本数据类型


# DataFrame概览
julia> iris
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species   
     │ Float64      Float64     Float64      Float64     Cat…
─────┼─────────────────────────────────────────────────────────────
   1 │  5.1         3.5          1.4         0.2         setosa
   2 │  4.9         3.0          1.4         0.2         setosa
  ⋮ │  ⋮           ⋮           ⋮          ⋮           ⋮  
 149 │  6.2         3.4          5.4         2.3         virginica
 150 │  5.9         3.0          5.1         1.8         virginica

# DataFrame基本操作

iris[1, 2]       # df[row, col]
iris[1, 2] = 0   # 赋值单元格
iris.TEST = collect(repeat('A', nrow(iris))) # 添加新列
iris[1:10, ["SepalLength", "Species"]]
iris.Species     # df.ColName
iris."Species"
iris[:, "Species"]
names(iris)
size(iris)
nrow(iris)
ncol(iris)
iris[iris.SepalLength .> 4, :]


数据挖掘的基本思路

"Split-Apply-Combine"策略

数据挖掘的基本思路

"Split-Apply-Combine"策略

# DataFrame概览

julia> iris
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species   
     │ Float64      Float64     Float64      Float64     Cat…
─────┼─────────────────────────────────────────────────────────────
   1 │  5.1         3.5          1.4         0.2         setosa
   2 │  4.9         3.0          1.4         0.2         setosa
  ⋮ │  ⋮           ⋮           ⋮          ⋮           ⋮  
 149 │  6.2         3.4          5.4         2.3         virginica
 150 │  5.9         3.0          5.1         1.8         virginica


# 统计每个物种中PetalWidth平均值, 以及PetalLength的中位数

using DataFrames, DataFramesMeta, Chain

@chain iris begin
    groupby(:Species)
    @combine(
        :PetalWidthMean = mean(:PetalWidth),
        :PetalLengthMedian = median(:PetalLength))
end

# >>> Result:
3×3 DataFrame
 Row │ Species     PetalWidthMean  PetalLengthMedian 
     │ Cat…        Float64         Float64
─────┼───────────────────────────────────────────────
   1 │ setosa      0.246           1.5
   2 │ versicolor  1.326           4.35
   3 │ virginica   2.026           5.55


拓展学习资料推荐