R programming羊羊學習筆記

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)

  1. 儘量使用向量計算,能不用循環就不用循環,因爲在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))
  1. 通過混合編程,用c編寫函數,R來調用,或者在python裏面調用R,都可以提高執行速度
  2. 並行處理,分爲並行硬件和並行軟件,這裏介紹並行處理軟件:
    • 安裝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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章