R语言基础教程6:程序设计基础
R語言基礎教程2:散點圖
R語言基礎教程3:曲線圖、誤差線和圖例
R語言基礎教程4:柱形圖
R語言基礎教程5:圖形頁面排版
R語言基礎教程6:程序設計基礎
R語言基礎教程7:數據描述性統計
使用R處理數據完全可以不了解它的編程方法,但編程可以提高效率。
一、運算符
?二、向量運算規則
?R語言的數據以向量為基礎。向量的運算不需要通過下標循環一個個元素來進行的。如果兩個向量長度相同,是對位置相同的數據進行相應計算;如果長度不同,較短的向量要重復取值直到兩個向量長度相同。如果短向量長度不是長向量的整倍數,仍可得到結果,但有警告。向量運算方式避免了使用循環,速度很快:
> (a <- 1:5)
[1] 1 2 3 4 5
> (b <- 2:6)
[1] 2 3 4 5 6
> (c <- 2:3)
[1] 2 3
> (d <- 2)
[1] 2
> a*b
[1]? 2? 6 12 20 30
> a*c
[1]? 2? 6? 6 12 10
警告信息:
In a * c : 長的對象長度不是短的對象長度的整倍數
> a*d
[1]? 2? 4? 6? 8 10
R語言的默認安裝包提供了大量的數學與統計函數。在R語言的定義中,運算符事實上也是函數:
1、操作符函數,包括算術函數、比較函數和邏輯函數:
算術函數:
??? "+", "-", "*", "^", "%%", "%/%", "/"
比較函數:
??? "==", ">", "<", "!=", "<=", ">="
邏輯函數
??? "&", "|".
2、數學函數:
??? "abs", "sign", "sqrt", "ceiling", "floor", "trunc", "cummax", "cummin", "cumprod", "cumsum", "log", "log10", "log2", "log1p", "acos", "acosh", "asin", "asinh", "atan", "atanh", "exp", "expm1", "cos", "cosh", "sin", "sinh", "tan", "tanh", "gamma", "lgamma", "digamma", "trigamma"
3、數學函數2:
??? "round", "signif"
4、統計特征值函數:
??? "max", "min", "range", "prod", "sum", "any", "all"
5、復數函數:
??? "Arg", "Conj", "Im", "Mod", "Re"
四、程序流程控制:
1、if/else分支語句:
基本用法是:if (邏輯判斷) { 語句 } else { 語句 }
2、switch分支語句:
基本用法是:switch(statment, list)
但具體意義和其他語言有些差別。第二個參數list可以分成多個參數,switch把2到n個參數都歸為一個list。list參數分有名參數和無名參數。
> a <- 2
> switch(a, log(a), a+3, a-3) #a=2,執行列表第二項:a+3
[1] 5
> a <- 1
> switch(a, log(a), a+3, a-3) #a=1,執行列表第一項:log(a)
[1] 0
> a <- "agi"
> switch(a, gi=1030567, agi="AT1G10010", name="CBFx") #返回a(名稱)對應的列表向量值
[1] "AT1G10010"
基本用法:for (name in expression) {? 語句 }
> a <- 1:5
> b <- NULL
> for(i in a) {b <- c(b,log(i))}
> b
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
> b <-log(a)
> b
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
跳出循環用break,忽略后面語句進行循環用next。
五、函數方法
R語言的很多工作都由函數完成,這是保證結果準確性和可重復性的途徑。我們也可以通過編寫自己的函數提高工作效率。
R語言中函數定義的方法為:函數名 <- function(參數們) { R語句們 }
用法是:函數名(參數們)
函數可以有返回值,返回值就是最后一個語句的結果;也可以只完成一系列操作(如繪圖)而不用返回值。
下面是一個兩系列數據的柱形圖繪制函數:
bar.plot <- function(y1, y2, x=1:length(y1),
sd1=y1*0.05, sd2=y2*0.05,
xlab="Sample", ylab="Level",
labels=c("S1","S2")){
the.data <- rbind(y1, y2)
par(mar=c(3,3,0.5,0.5))
par(mgp=c(2,0.5,0))
pos <- barplot(the.data, ylim=c(0, max(y1,y2)*1.2),
offset=0, axis.lty=1, beside=TRUE,
names.arg = x, col=c("orange","red"))
legend("topleft", legend=labels, fill=c("orange","red"),box.col="white", inset=0.02)
title(xlab=xlab, ylab=ylab)
bw <- 0.2
segments(pos[1,], y1-sd1, pos[1,], y1+sd1, lwd=2)
segments(pos[1,]-bw, y1+sd1, pos[1,]+bw, y1+sd1, lend=2)
segments(pos[1,]-bw, y1-sd1, pos[1,]+bw, y1-sd1, lend=2)
segments(pos[2,], y2-sd2, pos[2,], y2+sd2, lwd=2)
segments(pos[2,]-bw, y2+sd2, pos[2,]+bw, y2+sd2, lend=2)
segments(pos[2,]-bw, y2-sd2, pos[2,]+bw, y2-sd2, lend=2)
box()
}
> source("d:/mybar.R")
> NF <- c(17.44 , 2.56 , 2.70 , 18.71 , 5.61 , 32.98)
> CA <- c(11.48 , 0.75 , 1.16 , 12.73 , 2.84 , 20.04)
> sd.NF <- c(1.27 , 0.15 , 0.48 , 2.01 , 0.80 , 4.09)
> sd.CA <- c(1.09 , 0.36 , 0.11 , 1.82 , 0.92 , 2.36)
> x <- paste("S", 1:length(NF), sep="")
> bar.plot(x=x, y1=NF, y2=CA, sd1=sd.NF, sd2=sd.CA, labels=c("NF", "CA"))
?
由于bar.plot函數除y1和y2外其他參數都有默認值,你可以只提供兩個系列的數據(默認誤差為數據的5%):
> source("d:/mybar.R")
> set.seed(1000)
> y1 <- abs(rnorm(10))*10
> y2 <- abs(rnorm(10))*5
> bar.plot(y1,y2)
?
雖然數據更換了,但是獲得的圖形外觀完全一樣!這已經不僅僅是效率的問題了。是懶人的辦法,也是聰明人的辦法。比起origin作圖軟件,R的可重復性要好得多吧?Excel的作圖方法是小兒科了,談不上科學性(但是很多人在用,呵呵)。
總結
以上是生活随笔為你收集整理的R语言基础教程6:程序设计基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html自动化布局,自动化部门任务
- 下一篇: 口算训练