1- 這篇筆記內容源於the art of programming,如果有python基礎或者matlab基礎,看起來應該會非常快而且簡單
2-幾個內置常用函數(寫完覺得看起來有點亂)
help() #第一重要的函數,不會就help
AnyOfFunctionName #第二重要的,直接敲函數名,學習函數,直接看函數代碼
x = c(1,2,3,4) #賦值方法1
x <- c(1,2,3,4) #賦值方法2
c(1,2,3,4) -> x #賦值方法3
x = c(x,5) #添加值
x = c(x[1:2],5x[3:4]) #插入值
x = x[-2:-3] #刪除第二和第三個值
mean(x) #均值
sd(x) #標準差
sqrt(x) #開方
min(x) #最小值
max(x) #最大值
which.max(x) #最大值的位置
which.min(x) #最小值的位置
exp(x) #e冪次方
log(x) #求log
abs(x) #求絕對值
data() #打開選擇內置數據集
rnorm(2) #產生2個正態分佈的值
mean(Nile) #直接使用其中一個內置數據集求均值
hist(Nile) #繪製直方圖
x <<- x+1 #影響全局,<<-符號相當於global
m = rbind(c(1,2),c(3,4)) #按行合併
m = cbind(c(1,2),c(3,4)) #按列合併
m * m #矩陣點乘
m %*% m #矩陣乘
x$u #類似於成員關係struct.member,R語言中list相當於c的struct
data = read.table("xx.txt",header = F) #讀表格數據,無特徵名字
class(m) #查詢數據所屬類型
str(m) #轉換爲字符類型
as.character(m) #轉換爲字符類型
as.numeric(m) #轉換爲數值類型
method(as) #查看所有的as方法
attribute(m) #查詢矩陣維度
head(data) #查看data的前小部分數據
tail(data) #查看data的後小部分數據
length(data) #變量元素個數,字符串除外
y = vector(length = 2) #聲明y爲長度爲2的向量
1:3 #產生1,2,3
1:3-1 #產生0,1,2
1:(3-1) #產生1,2
seq(1,6) #產生序列1,2,3,4,5,6
seq(1,6,2) #產生序列1,3,5
rep(3,4) #重複產生3,3,3,3
rep(1:3,2) #重複產生1,2,3,1,2,3
any(x>80) #只要x中元素有一個大於80,就是TRUE
all(x>80) #x所有元素大於80,纔是TRUE
c(1,2)+c(1,2,3,4) #長度不一致向量相加,產生2,4,4,6,短的向量被重複利用,同理,四則運算一致,同理,可以把矩陣按列排成向量
z[-1:-3] #取z向量除了第一到第三個元素的其他元素
name(x) = c("sex","name","age") #給x各列元素添加特徵名
x["name"] #當命名之後可以直接輸出整列
x[1] #如果x已命名,輸出該列包括名字(tag)
x[[1]] #如果x已命名,輸出第一列的名字(tag)
round(x) #對x每個元素四捨五入
x = x[x*2 > 10] #濾波器,返回所有2倍x元素大於10的值
which(x*2 > 10) #濾波器,返回所有2倍x元素大於10的下標(位置)
y = x > 10 #對一個向量做判斷,返回一個bool向量
x = ifelse(y%%2==0,2,1) #如果y是偶數,x=2,否則x=1
x = ifelse(k == 'M',1,ifelse(k == 'N',2,3)) #嵌套
m = matrix(c(1,2,3,4),2,2) #生成2行2列矩陣
m = matrix(0,3,3) #生成3行3列零矩陣
m1 = m[2,,drop = F] #獲取m矩陣的第二行作爲矩陣來處理,而不是向量
v = as.matirx(m) #把m向量處理成v矩陣
x = sort(x) #對x排序
union(x,y) #取並集
intersect(x,y) #取交集
setdiff(x,y) #x中有哪幾個元素是y沒有的
setdiff(y,x) #y中有哪幾個元素是x沒有的
combn(1:4,2) #1-4中兩兩組合的所有可能,生成matrix
#輸入輸出
#以下兩個函數都可以傳入文件名,讀取文件
z = scan() #一直接收數值數據,直到2個回車
z = readline() #接收一行數據,包括數字空格字符
print(z) #單一輸出z
sprintf("abc%dac",1) #像c語言一樣格式化輸出,結果abc1dac
cat(z,"123") #cat可以合併輸出結果z 123
cat(z,"123",sep ='') #默認用空格連接,改成無字符連接,結果z123
#everything is object
ls() #查看所有使用中的對象
rm(x1,x2) #刪除x1,x2對象
exists("data") #查看data這個對象存在與否
get("data") #獲取data這個對象的內容
lines(x,y) #畫折線
points(x,y) #在當前圖畫點
legend() #
text(x,y,"abc") #在當前圖(x,y)位置添加文本abc
text(locator(1),"abc") #利用指示器點擊任意位置添加文本abc
paste("num",1) #得到結果num 1(中間有空格)
paste("num",1,sep='') #得到結果num1
3-R幾個常見概念
- session一次會話,當你保存一次會話使,生成一個Rdata文件,該會話存儲了你在console敲的所有變量,當你加載了這個session就加載了所有存儲的變量
- R的向量下標從1開始
- R的邏輯操作符 &與,|或,!非
- R語言apply用法:
- 在for循環中可以用 a in b,列舉所有b的元素放到a,但是想要確定某個元素在不在b要用a %in% b,查看b裏面有沒有a。
4-R的DataFrame操作
x = data.frame(c(1,2),c('a','b'),stringAsFactors = F) #創建
names(x) = c('key','value') #命名
#其他操作類比list,好像沒差
5-R讀入數據進行統計
示例
y = factors(c('a','b','a','b','a'))
z = table(y)
#z
#a b
#3 2
as.vector(z)
#3 2
所以我們可以利用table函數對讀入的數據進行統計
6-R解決線性方程組,有意思
a = matrix(c(1,1,-1,1),2,2)
b = c(2,4)
solve(a,b)
#3 1
#x-y=2 solve解方程, x=3
#x+y=4 y=1
7-R-OOP
#簡單的定義一個類
setClass("myClass",
representation(
name = "character",
age = "numeric",
marriaged = "logical"
)
)
#創建一個對象實例
andy = new("myClass",name = "andy",age = 19,marriaged = T)
#訪問對象成員
andy@age
#19
#我們敲入andy的時候會調用show()函數來顯示,我們可以重寫這個函數
setMethod("show","myClass",
function(object){
inOrOut = ifelse(object@marriaged,"is","is not")
cat(object@name,"is",object@age,"this year and",inOrOut,"marriaged!\n")
}
)
#andy
#andy is 19 this year and is marriaged!
#好玩吧
8-R線性迴歸簡單舉例
x = c(1,3,4)
y = c(1,5,9)
plot(x,y) #畫出點圖
lmr = lm(y~x) #y對x的線性迴歸
abline(lmr) #在原點圖的基礎上畫出線性迴歸
#解釋一下abline(c(2,1))對應畫y=x+2的函數
9-R畫三維圖簡單舉例
library(lattice)
a = 1:10
b = 1:15
eg = expand.grid(x=a,y=b) #生成一個數據框架
eg$z = eg$x^2 +eg$x * eg$y #z = x^2 + x*y
wireframe(z~x+y,eg,shade = T) #畫出了一個這樣的平面
10-R語言提高執行速度(但是要注意,大部分情況下,time反比memory)
- 儘量使用向量計算,能不用循環就不用循環,因爲在R語言裏面“:”是調用函數的,“[”,“]”也是要調用函數的,所以在for循環裏面要一直調用函數,降低執行速度。可以提高執行速度的向量化函數ifelse(),which(),any(),where(),all()。matrix也是一種特殊的向量
example:
#ORIGINAL
sum = 0
nreps = 100000
for(i in 1:nreps){
xy = rnorm(2)
sum = sum + max(xy)
}
print(sum/nreps)
#VERCTERIZE
nreps = 100000
yxmat = matrix(rnrom(2*nreps),ncol = 2)
maxs = pmax(xymat[,1],xymat[,2])
print(mean(maxs))
- 通過混合編程,用c編寫函數,R來調用,或者在python裏面調用R,都可以提高執行速度
- 並行處理,分爲並行硬件和並行軟件,這裏介紹並行處理軟件:
- 安裝OpenMP、LAM或者MPICH2,R包Rmpi提供接口對MPI(message-passing interface)(具體操作步驟參考“the art of R programming -Chapter 17.2”)
- 重頭戲,snow package,畢竟Rmpi的操作實在太複雜了,snow package運行速度在Rmpi之上,直接通過網絡socket
cls = makeCluster(type = "SOCK",spec = c("PC48","PC49")) #以TCP/IP工作方式
#不使用snow
apply(a,1,"%*%",c(1,1))
#使用snow
parApply(cls,a,1,"%*%",c(1,1))
stopCluster(cls) #不用的時候退出
總之,snow包要好好學,好好用,要寫也寫不完。。。
兩個網址,好好看:
- http://cran.cnr.berkeley.edu/web/packages/snow/index.html
- http://www.sfu.ca/~sblay/R/snow.html#clusterCall#
“the art of R programming”download
鏈接:http://pan.baidu.com/s/1o7Vnc06 密碼:ydnj