我只挑取了我平时用的不多的一些操作,或者是看完眼前突然一亮的更精简的代码,遗漏之处还请多多指教。
common mathematic functions.pngSimple Calculations in R,calling Functions,and Getting help in R
1.round
usage(进行数值的round our square root(四舍五入))
默认保留小数点后0位,如:
> round(sqrt(3.5))
[1] 2
也可以通过指定值来改变保留位数。
> round(sqrt(3.5),digits = 3)
[1] 1.871
#简写为
> round(sqrt(3.5),3)
[1] 1.871
Vectors, Vectorization, and Indexing
一个向量的长度为1,可以使用length()
来查看向量的长度,使用c
来创造更长的向量。
> x <- c(56, 95.3, 0.4)
> x
[1] 56.0 95.3 0.4
> length(x)
[1] 3
R的算术运算符都是向量化的,不过运算前要保证两向量长度相等或长向量是短向量的整数倍。
> y <- c(3.2, 1.1, 0.2)
> y
[1] 3.2 1.1 0.2
> x+y #+-*/均可
[1] 59.2 96.4 0.6
产生整数序列。
> seq(3, 5)
[1] 3 4 5
> 1:5
[1] 1 2 3 4 5
短向量和长向量进行运算时,会将短向量进行对长向量的再循环(recycle)。
> c(1, 2) + c(0, 0, 0, 0)#加减乘除均可
[1] 1 2 1 2
> c(1, 2) + c(0, 0, 0)
[1] 1 2 1
Warning message:
In c(1, 2) + c(0, 0, 0) : 长的对象长度不是短的对象长度的整倍数
除了四则运算,一些R的其他算术功能也是向量化的,如sqrt(),round(),log()
。
> sqrt(x)
[1] 7.4833148 9.7621719 0.6324555
> round(sqrt(x), 3)
[1] 7.483 9.762 0.632
> log(x)/2 + 1 # note how we can combined vectorized operations
[1] 3.0126758 3.2785149 0.5418546
对向量中的单个元素进行位置提取或赋值。
> x <- c(56, 95.3, 0.4)
> x[2]
[1] 95.3
> x[4] #提取不存在的元素显示not availabel.
[1] NA
> x[3] <- 0.5
> x
[1] 56.0 95.3 0.5
设置、更改向量的名字。
> b <- c(a=3.4, b=5.4, c=0.4)
> b
a b c
3.4 5.4 0.4
> names(b)
[1] "a" "b" "c"
> names(b) <- c("x", "y", "z") # change these names
> b
x y z
3.4 5.4 0.4
根据字符来提取向量中的元素。
> b['x']
x
3.4
从向量中根据位置同时提取多个元素,同一位置的元素可进行多次提取。
> x[c(2,3)]
[1] 95.3 0.5
> z <- c(3.4, 2.2, 0.4, -0.4, 1.2)
> z[3:5] # extract third, fourth, and fifth elements
[1] 0.4 -0.4 1.2
对于提取超出范围元素,R会返回NA。
> z[c(2, 1, 10)]
[1] 2.2 3.4 NA
使用负号排除不想提取的元素。
> z[c(-4, -5)] # exclude fourth and fifth elements
[1] 3.4 2.2 0.4
使用提取对向量内的元素进行重排。
> z[c(3, 2, 4, 5, 1)]
[1] 0.4 2.2 -0.4 1.2 3.4
对向量内的元素根据位置进行颠倒。
> z[5:1]
[1] 1.2 -0.4 0.4 2.2 3.4
order()返回索引的向量,揭示了元素的顺序,默认是升序。p186,不懂这个顺序是什么顺序。
> order(z)
[1] 4 3 5 2 1
> z[order(z)]
[1] -0.4 0.4 1.2 2.2 3.4
> order(z, decreasing=TRUE)
[1] 1 2 5 3 4
> z[order(z, decreasing=TRUE)]
[1] 3.4 2.2 1.2 0.4 -0.4
使用sample()产生随机数。
> set.seed(0) # we set the random number seed so this example is reproducible
> i <- sample(length(z), replace=TRUE)
> i
[1] 5 2 2 3 5
> z[i]
[1] 1.2 2.2 2.2 0.4 1.2
使用比较运算符,如==,!=,<,<=,>,>=
,来产生逻辑向量TRUE或FALSE。
> v <- c(2.3, 6, -3, 3.8, 2, -1.1)
> v == 6
[1] FALSE TRUE FALSE FALSE FALSE FALSE
> v <= -3
[1] FALSE FALSE TRUE FALSE FALSE FALSE
> abs(v) > 5
[1] FALSE TRUE FALSE FALSE FALSE FALSE
还可使用逻辑运算符来提取元素。
> v[c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)]
[1] 2.3 6.0 3.8
#如果碰到,某一列元素有多个值,不能挨个输入位置进行提取时
index1<-grep("RNA-seq",a$v1)
a[index1,]
提取向量中满足某一条件的元素。
> v[v > 2]
[1] 2.3 6.0 3.8
比较运算符和逻辑运算符(&(and),|(or),!(no))的连用
> v > 2 & v < 4
[1] TRUE FALSE FALSE TRUE FALSE FALSE
> v[v > 2 & v < 4]
[1] 2.3 3.8
R的比较运算符和逻辑运算符。
>
大于
<
小于
>=
大于或等于
<=
小于或等于
==
等于
!
不等于
&&
逻辑和(and)
||
逻辑或(or)
&
元素逻辑和(and)
|
元素逻辑或(or)
!
元素逻辑非(not)
Vector types
R' vector types2.png
R的特殊值:
NA
not available,代表丢失值。
NULL
代表没有值。
-Inf,Inf
正负无穷
NaN
not a number
Factors and classes in R
factors存储类别向量。
> chr_hits <- c("chr2", "chr2", "chr3", "chrX", "chr2", "chr3", "chr3")
> hits <- factor(chr_hits)
> hits
[1] chr2 chr2 chr3 chrX chr2 chr3 chr3
Levels: chr2 chr3 chrX
> levels(hits)
[1] "chr2" "chr3" "chrX"
使用levels
去包含所有相关的levels
> hits <- factor(chr_hits, levels=c("chrX", "chrY", "chr2", "chr3", "chr4"))
> hits
[1] chr2 chr2 chr3 chrX chr2 chr3 chr3
Levels: chrX chrY chr2 chr3 chr4
添加或重命名现存的levels。
> levels(hits) <- list(chrX="chrX", chrY="chrY", chr2="chr2",
chr3="chr3", chr4="chr4")
> hits
[1] chr2 chr2 chr3 chrX chr2 chr3 chr3
Levels: chrX chrY chr2 chr3 chr4
使用table()对levels里的个数进行计数。
> table(hits)
hits
chrX chrY chr2 chr3 chr4
1 0 3 3 0
Exploring and Transforming Dataframes
> d <- read.csv("Dataset_S1.txt")
> bd <- read.delim("noheader.bed", header=FALSE,
col.names=c("chrom", "start", "end"))
使用nrow
或ncol
来查看行或列的维度。
> nrow(d)
[1] 59140
> ncol(d)
[1] 16
> dim(d)
[1] 59140 16
也可单独显示其行名rownames()或列名colnames().
> colnames(d)
[1] "start" "end" "total.SNPs" "total.Bases"
[5] "depth" "unique.SNPs" "dhSNPs" "reference.Bases"
[9] "Theta" "Pi" "Heterozygosity" "X.GC"
[13] "Recombination" "Divergence" "Constraint" "SNPs"
使用summary()
来查看某一列数值分布情况。
> summary(d$total.SNPs)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 3.000 7.000 8.906 12.000 93.000
从数据框提出来的数据仍然是向量。
> d[d$Pi > 16 & d$percent.GC > 80, c("start", "end", "Pi", "depth")]
start end Pi depth
58550 63097001 63098000 41.172 2.39
58641 63188001 63189000 16.436 3.21
58642 63189001 63190000 41.099 1.89
如果我们想要从数据框中提出来的数据变为数字,可以用以下代码。(注意这里我们没有必要在中括号里面用逗号是因为d$percent
是一个向量,而不是一个二维数据框)
#提出所有pi值大于16的所有GC含量的观察值。
> d$percent.GC[d$Pi > 16]
[1] 39.1391 38.0380 36.8368 36.7367 43.0430 41.1411 [...]
提取满足某一列条件的另一列元素。
#可以使用比较运算符,看GC含量大(小)于80的测序深度
> summary(d$depth[d$percent.GC >= 80])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.05 1.89 2.14 2.24 2.78 3.37
> summary(d$depth[d$percent.GC < 80])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 6.970 8.170 8.185 9.400 21.910
#使用逻辑运算符,查看(不)在着丝粒的pi值
> summary(d$Pi[d$cent])
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 7.95 16.08 20.41 27.36 194.40
> summary(d$Pi[!d$cent])
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 5.557 10.370 12.290 16.790 265.300
which()返回真值所在的位置。
> d$Pi > 3
[1] FALSE TRUE FALSE TRUE TRUE TRUE [...]
> which(d$Pi > 3)
[1] 2 4 5 6 7 10 [...]
#一个相等的用法
d[$Pi > 3, ] is identical to d[which(d$Pi > 3), ]
通常使用逻辑值从数据框中取子集时省略which(),这样使得代码更简洁。
which()返回向量中第一个最小值和最大值的索引。
> d[which.min(d$total.Bases),]
start end total.SNPs total.Bases depth [...]
25689 25785001 25786000 0 110 1.24 [...]
> d[which.max(d$depth),]
start end total.SNPs total.Bases depth [...]
8718 8773001 8774000 58 21914 21.91 [...]
使用subset()
提取元素,不需要使用$
来指定列。基本用法就两个参数,第一个参数指明要操作的数据框,第二个参数说明操作条件。
$ subset(d, Pi > 16 & percent.GC > 80)
start end total.SNPs total.Bases depth [...]
58550 63097001 63098000 5 947 2.39 [...]
#上述代码也等同于
d[d$Pi > 16 & d$percent.GC > 80, ]
在subset()添加第三个参数来指定列打印到屏幕上。
> subset(d, Pi > 16 & percent.GC > 80,
c(start, end, Pi, percent.GC, depth))
start end Pi percent.GC depth
58550 63097001 63098000 41.172 82.0821 2.39
58641 63188001 63189000 16.436 82.3824 3.21
58642 63189001 63190000 41.099 80.5806 1.89
参考:
《Bioinformatics Data Skills》
素材地址:https://github.com/vsbuffalo/bds-files
网友评论