source(“abc.R”)
Rscript abc.R
3:8#> [1] 3 4 5 6 7 84:1#> [1] 4 3 2 1seq(3,8)#> [1] 3 4 5 6 7 8seq(3,8,2)#> [1] 3 5 7seq(from=12,to=21,by=3)#> [1] 12 15 18 21rep(0,5)#> [1] 0 0 0 0 0rep(1:2,3)#> [1] 1 2 1 2 1 2rep(c(1,2,3),each=2)#> [1] 1 1 2 2 3 3
x<-c(1,2,3,4)x<-c(x[1:3],5.5,x[4]) #添加5.5到最后一個元素之前x#> [1] 1.0 2.0 3.0 5.5 4.0#刪除第三個元素y=x[-3]y#> [1] 1.0 2.0 5.5 4.0
x <- c(1,2,3,4,5,6)length(x)#> [1] 6
下面連個運算等價
x<-c(1,2,3)+ c(1,2,3,4,5,6)x#> [1] 2 4 6 5 7 9x<-c(1,2,3,1,2,3) + c(1,2,3,4,5,6)x#> [1] 2 4 6 5 7 9
向量運算+,-,*,/,%%,>,<,== 運算都是先補齊,然后逐個元素進行運算
y<-c(1,2,3,4,5,6)y[c(1,3)] #第1,3個元素#> [1] 1 3y[c(1,1,3)]#> [1] 1 1 3y[1:3] #第一到第三個元素#> [1] 1 2 3y[-1:-2] #負數的下標表示把相應的元素剔除#> [1] 3 4 5 6
x=seq(1,10)any(x>7)#> [1] TRUEall(x>7)#> [1] FALSEall(x>0)#> [1] TRUE
NA缺失值,通常需要進行處理,如mean(x,na.rm=T)
NULL可用于在循環中創建向量
如
z<-NULLfor (i in 1:10) if(i %% 2 == 0) z<-c(z,i)z#> [1] 2 4 6 8 10
這里不需要一個map函數,可以直接像下面這樣使用[
進行篩選
z<-c(1,2,3,4,5)#選出平方<4的元素z[z*z > 4]#> [1] 3 4 5
可以把篩選語句放在賦值運算符的左邊,如
z <- 1:5z[z*z>4] <- 0z#> [1] 1 2 0 0 0
subset
也可用于篩選, 如:
z <- 5:1subset(z,z>3)#> [1] 5 4
z <- 3:7which(z*z>16) #> [1] 3 4 5#which函數也可以用于篩選中,如z[which(z*z>16)]#> [1] 5 6 7
ifelse(b,u,v)
b <- c(1,0,1,0,0)aa <- c(5,2,5,2,2)bb <- c(15,12,15,12,12)ifelse(b,aa,bb)#> [1] 5 12 5 12 12
z<- 1:3names(z) <-c('a','b','c')names(z)#> [1] "a" "b" "c"
v1=c(1,2,2,3,4,3)unique.default(v1)#> [1] 1 2 3 4v1[which(!duplicated(v1))]#> [1] 1 2 3 4
x=1:3y=4:6x+y#> [1] 5 7 9x-y#> [1] -3 -3 -3x*y#> [1] 4 10 18y / x#> [1] 4.0 2.5 2.0y %% x#> [1] 0 1 0y > x#> [1] TRUE TRUE TRUEy < x#> [1] FALSE FALSE FALSEy == x#> [1] FALSE FALSE FALSE
y<-matrix(c(1,2,3,4,5,6),nrow=2)y#> [,1] [,2] [,3]#> [1,] 1 3 5#> [2,] 2 4 6y<-matrix(c(1,2,3,4,5,6),ncol=2)y#> [,1] [,2]#> [1,] 1 4#> [2,] 2 5#> [3,] 3 6#也可用NA初始化一個矩陣y<-matrix(nrow=2,ncol=3)y#> [,1] [,2] [,3]#> [1,] NA NA NA#> [2,] NA NA NA#矩陣是按列存儲的。即先存第一列再存第二列。#可以使用byrow=T參數來指定矩陣按行存儲。 #比較下面兩個矩陣的區別y<-matrix(1:16,nrow=4,byrow=T)y#> [,1] [,2] [,3] [,4]#> [1,] 1 2 3 4#> [2,] 5 6 7 8#> [3,] 9 10 11 12#> [4,] 13 14 15 16y<-matrix(1:16,nrow=4)y#> [,1] [,2] [,3] [,4]#> [1,] 1 5 9 13#> [2,] 2 6 10 14#> [3,] 3 7 11 15#> [4,] 4 8 12 16
y[,2] #取出y的第二列#> [1] 5 6 7 8y[1:2,] #取出y的第一二行#> [,1] [,2] [,3] [,4]#> [1,] 1 5 9 13#> [2,] 2 6 10 14y[,1:2] #取出y的第一二列#> [,1] [,2]#> [1,] 1 5#> [2,] 2 6#> [3,] 3 7#> [4,] 4 8y[2:3,2:3] #取出y的子矩陣#> [,1] [,2]#> [1,] 6 10#> [2,] 7 11
矩陣元素篩選
#取出y的行,其第二列>7,并且第三列>10y[y[,2]>7 & y[,3]>10,]#> [1] 4 8 12 16
矩陣相乘 %\*%
這個不是逐元素計算的,而是數學上的矩陣相乘,要逐元素相乘,使用*
運算符
apply(m,dimcode,f,fargs)
m是矩陣,dimcode
指定行或者列,1
表示行,2
表示列。f
為要使用的函數,fargs
是可選參數
如apply(y,1,mean)
對y每行求平均。
apply(y,1,mean)#> [1] 7 8 9 10
需要注意apply函數返回的矩陣元素排列的行列問題,必要時使用t()
函數對矩陣進行轉置。
cbind
,rbind
分別為矩陣添加列和添加行,兩個向量也可以直接構造矩陣,
cbind(c(1,2),c(3,4))#> [,1] [,2]#> [1,] 1 3#> [2,] 2 4
因為矩陣也是向量,所以length(y)
返回的是矩陣的元素個數。nrow(y)
,ncol(y)
分別返回矩陣的行數和列數
y <- matrix(1:4,nrow=2)colnames(y)<-c('col1','col2')rownames(y)<-c('row1','row2')y#> col1 col2#> row1 1 3#> row2 2 4
array(data = NA, dim = length(data), dimnames = NULL)
R中用不同的行表示不同的觀測,不同的列表示不同的變量,如果再添加上時間變量,數據就變成三維的了。三維數組是在矩陣的基礎上再添加一個層的概念。如
firsttest<-matrix(c(1,2,3,4),ncol=2)secondtest<-matrix(c(5,6,7,8),ncol=2)tests<-array(c(firsttest,secondtest),dim=c(2,2,2))tests#> , , 1#> #> [,1] [,2]#> [1,] 1 3#> [2,] 2 4#> #> , , 2#> #> [,1] [,2]#> [1,] 5 7#> [2,] 6 8
其中dim
最后一個2表示數據分為兩層。tests中的數據由三個下標來訪問。
x=1:10xa=array(x)x#> [1] 1 2 3 4 5 6 7 8 9 10xa#> [1] 1 2 3 4 5 6 7 8 9 10#dim的返回值不同dim(x)#> NULLdim(xa)#> [1] 10#class不同class(x)#> [1] "integer"class(xa)#> [1] "array"
j<-list(name='jianghang',age=24,salary=1000,url='http://www.bagualu.net')j#> $name#> [1] "jianghang"#> #> $age#> [1] 24#> #> $salary#> [1] 1000#> #> $url#> [1] "http://www.bagualu.net"k<-list(1:5,2:10)k#> [[1]]#> [1] 1 2 3 4 5#> #> [[2]]#> [1] 2 3 4 5 6 7 8 9 10
j[['name']]#> [1] "jianghang"j[[1]]#> [1] "jianghang"j[1]#> $name#> [1] "jianghang"#列表中的名字names(j)#> [1] "name" "age" "salary" "url"
注意雙中括號和單中括號的區別,單中括號返回的是列表類型,雙中括號則返回的是單個元素類型。
j[['phone']]=13623232323
j[['phone']]=NULL
length(j)#> [1] 4
lapply()
對列表的每個組件執行給定函數,如
lapply(list(1:3,2:4),mean) #返回列表形式。#> [[1]]#> [1] 2#> #> [[2]]#> [1] 3sapply(list(1:3,2:4),mean) #返回的是向量形式。#> [1] 2 3
sapply也可以返回矩陣形式,如果執行的函數返回的是向量。
rl<-list(a=1,b=list(1:3,2:4))rl#> $a#> [1] 1#> #> $b#> $b[[1]]#> [1] 1 2 3#> #> $b[[2]]#> [1] 2 3 4
數據框結構類似矩陣,只是每列的數據類型可以不一樣。但是每列的長度是要求一樣的。
創建數據框:d<-data.frame(a=c(1,2,3,4),names=c(“a”,”b”,”c”,”d”))
訪問元素:d$a 訪問a列, d$names訪問names列, 也可用矩陣方式來訪問: d[,1] 得到d的第一列
提取子數據框: d[2:3,2,drop=FALSE] 注意這里的drop參數,表示返回的依然是一個數據框而不是向量
缺失值的處理: 如果d中有NA,可以用complete.cases來去掉缺失值. d[complete.cases(d),] 即為沒有缺失值的行組成的數據框
rbind和cbind可同樣用于數據框,只是要求行或者列的長度與原數據框一樣
如果數據框的每列數據類型相同,可以使用apply函數, 使用方法和矩陣一樣。
合并數據框:merge(x,y), merge根據x,y中的同名列來合并x,y的列. 如果x,y中沒有同名的列,可以用by.x , by.y來指定列的名字。
數據框是列表的特列,可以像列表那樣在數據框上使用lapply和sapply
因子和水平
x<-c(5,12,13,12)
xf<-factor(x) 因子xf包含有三個水平5,12,13 , 因子長度length(xf)是數據的長度為4,即c(1,2,3,2),而不是因子的個數
tapply(x,f,g) 函數, 其中x是向量,f是因子,g是函數。意思是對因子f的每個水平調用函數g。
如ages<-c(25,26,27,55) aff<-c(“A”,”A”,”B”,”C”) tapply(ages,aff,mean) ,先對ages按照aff分組,然后每組求平均。
split()函數 ,將向量根據因子進行分組。 基本形式為split(x,f) ,返回值為list類型,x為向量或者數據框,f為因子或者因子的列表。, 如split(d$income,list(d$gender,d$over25)) 其中d為一個數據框,包含有列income,gender,over25.
by()函數和tapply相似,區別是by可以作用于數據框,而不僅僅是向量。如by(d,d$gender,function(m) lm(m[,2]~[,3])) 表示對數據框d,先按照gender因子分組,然后對每組進行回歸分析。
表的操作:fl<-list(c(5,12,13,12,13),c(“a”,”bc”,”a”,”bc”,”a”)) table(fl) 將生成兩個因子的頻數表。因此table的第一個參數為因子或者因子的列表 , 列表也可以是三維的或1維的。
table元素的訪問也可以像矩陣一樣通過下標來訪問。另外可以通過addmargins(tbl)來獲得該表的邊際值。
aggregate()匯總函數,實例:aggregate(aba[,-1],list(aba$Gender),median) , 表示取數據框第一列以外的其他列,按照Gender分組后,對每一列(每個變量)調用median函數。
cut()函數,該函數給定一個數據向量x,一個區間向量b,確定x中每個元素將落入哪個區間。返回區間的序號向量。
如z<-rnorm(10) bin<-seq(from=0.0,to=1.0,by=0.1) cut(z,bin,labels=F) 即計算z的每個值位于bin的哪個區間。
R語言編程結構
for (n in x) {print(n)}
i<-10 while(i>0) { i <- i -1}
while(TRUE) { i <- i +1 if (i<0) break}
repeat {i <-i-1 if(i<0) break}
直接進行下一次循環,用next語句
if( x== 4) { x<- 1 } else{ x<-2}
算術運算及邏輯運算符:
+,-,*,/,^,%%(模運算),%/%(整數除法),==,<=,>=,&&(標量邏輯與操作),||,&(向量邏輯與操作),|,!
exp(),log(),log10(),seqrt(),abs(),sin(),cos(),min(),max(),which.min(),which.max(),pmin(),pmax(),sum(),prod(), cumsum(),cumprod(),round(),floor(),ceiling(), factorial()
微分: D(expression(exp(x^2)),”x”) , 給出微分形式
積分: integrate(function(x) x^2,0,1) —>0.333
統計分布函數: [dpqr][norm|chisq|binom] 等函數 d概率密度函數,p累計分布,q對應分布的分位數,r隨機生成函數
排序:sort(x) , order(x) , order函數返回的排序后的索引向量,可用于對數據框進行排序。 rank(x) 返回每個元素在向量中的排名序號。
向量點積: crossprod(1:3,c(5,12,13)) 注意這個名字有些問題,計算的是點積(1*5+2*12+3*13)而不是叉積。
矩陣乘法: %*%
解線性方程組: solve(a,b) , a是系數矩陣,b是方程右邊的值。 如果調用solve時不指定b,則返回矩陣a的逆矩陣。
更多函數: t() 矩陣轉置, qr() 矩陣QR分解, chol() Cholesky分解 , det() 矩陣行列式的值, eigen()矩陣的特征值和特征向量
diag() 從方陣中提出對角矩陣 sweep() 數值分析批量運算符
sweep舉例:sweep(x,1,c(1,2,3),”+”) 表示對矩陣x的1,2,3行分別加上數值1,2,3 , 第二個參數1表明是對行進行操作。
集合運算: union(x,y)并集 , intersect(x,y) 交集, setdiff(x,y)集合的差, seqequal(x,y)檢驗集合是否相等 c %in% x 判斷x是否在集合x里面
尋找泛型函數:methods(print)
列出所有的print函數,標星的為不在默認命名空間中的函數,可以通過getAnywhere()來找到這些函數,然后使用命名空間限定符訪問他們。getAnywhere(print.ABC) , 如果找到會列出其所在的命名空間(假設為util),然后利用util:::print.ABC() 來調用這個函數。
查找一個類中所有的函數可以利用 methods(class=”lm”)
后面的lm 為類名。
編寫一個s3類,只需給定類名即可,class(alist)<-className
為類添加方法:
print.className<-function()
這樣,print(className)即會調用到這個方法。
繼承: 給定類名時,給出的是一個向量而不是一個名字,前面的類繼承后面的類。
如: class(x)<-c(subclass,parentClass)
這樣父類定義的方法,子類也可以使用。
s3類有安全隱患,因為有時候成員變量寫錯了,s3并不會給提示。S4類加強了這類檢查。語法上也有不同。
定義類: setClass()
創建對象 : new()
引用成員變量 @
實現泛型函數: setMethod()
聲明泛型函數: setGeneric()
列出所有的對象: ls()
刪除對象: rm() , 刪除所有對象: rm(list=ls())
保存對象: save(x,”xfile”) 把x保存在文件xfile中,后面可以用load(“xfile”)裝載這個對象
查看對象內部結構:class(x) mode(x) names(x) attributes(x) unclass(x) str(x) edit(x) edit函數可以看到該對象的所有數據,看起來最有用了。
exists(“x”) 查看對象是否存在 其中x為對象名字,需要用引號
scan()函數 , 讀取文本文件,缺省情況下讀取文件中以空格分割的所有浮點數值。 即scan(“a.txt”) , 返回一個向量
如果文件中包含非數值,可以字符串形式讀入,scan(“a.txt”,what=””) , 返回所有已空格分割的字符串向量。
如果指定分隔符為換行,scan(“a.txt”,what=””,sep=”\n”) 返回以換行分割的字符串向量
readline() 可以從鍵盤讀取單行數據,如age<-readline(“input the age:”)
如果數據為表格形式:因為有表頭,用scan不能讀入,可以用read.table()函數。
如果全是數據,且為矩陣形式,可以用matrix+ scan讀入矩陣,x<-matrix(scan(“x”),nrow=5,byrow=T)
readLines(“a.txt”) 可以讀取文本文件,每一行當做一個字符串。等價于scan中指定分隔符為換行
readLines也可以一次讀取一行:如下:
aa<-file(“a.txt”,”r”)
while(T){
rl<-readLines(aa,n=1)
if(length(rl) ==0) {print(“feof”) break}
else{print(rl)}
}
seek()函數可以移動文件指針。
read.table和scan也可以以網站地址作為參數,一次來讀取網絡上的數據。read.table(“http://xx.xx.xx”,head=T)
write.table() 把數據框輸出到文件
矩陣也可以直接利用write.table寫入文件,不過要聲明row.names=F,col.names=F ,即不輸出行名和列名
cat也可以用來寫文件, cat(“def\n”,file=”xx”,append=T) 追加的時候要加上append參數
cat可以一次寫多個值,cat(file=”xx”,”a”,”b”,”c”)
writeLines()
ff<-file(“www”,”w”)
writeLines(c(“abc”,”def”,”gg”),ff)
close(ff)
將生成一個三行的文件。
file.info()
dir() 列出指定目錄中所有的文件,可選參數recursive=T可遞歸列出所有的子目錄文件
file.exists()判斷文件是否存在
getwd() setwd()獲得和設置當前工作目錄
file.copy(from, to, overwrite = recursive, recursive = FALSE, copy.mode = TRUE, copy.date = FALSE)file.rename(from, to)file.remove(...)
grep() grep(“he”,c(“hello”,”world”,”hhe”,”haha”)) —>返回c(1,3) ,如果沒有匹配的,則返回一個空向量
nchar(“abc”) —>3 返回字符串的長度, 注意如果參數不是字符串,返回值可能無法預料,如nchar(NA)=2
paste(“a”,”b”,”c”) —>”abc” 拼接字符串, 可以指定sep=”” ,指定拼接是的分隔符
把一個字符串向量拼接成單個字符串,使用collapse
參數。如:
aa=c("hello","world")paste(aa,collapse=" ")#> [1] "hello world"
stringr::str_extract
, 如下所示aa=c("markdown/p123.html","markdown/p345.html","markdown/p789.html")bb=stringr::str_extract(aa,"p\\d+")bb#> [1] "p123" "p345" "p789"sprintf("%s.md",bb)#> [1] "p123.md" "p345.md" "p789.md"
stringi::stri_replace_all_regex("aaa-bb","(a+)\\-(b+)","$1+$2")#> [1] "aaa+bb"
sprintf(“aa is %d”,4) 生成格式化的字符串
substr(x,start,stop) 返回字符串x的start:stop上的子字符串
strsplit(x,split) 根據split將x分割成若干字符串,返回字符串組成的列表
regexpr(“he”,”wwwhe”) 返回he在后面字符串中出現的位置,此例返回4
gregexpr , 意義同上面的函數,只是返回所有的位置,而不僅僅是第一個位置
上面的grep,regexpr,gregexpr等函數,第一個參數可以是正則表達式
aa=c("hello","world","!")bb=sub('l',"L",aa)bb#> [1] "heLlo" "worLd" "!"bb=gsub('l',"L",aa)bb#> [1] "heLLo" "worLd" "!"
library(XML)
doc<-htmlTreeParse(url,useInternalNodes=T,encoding=”gb2312″)
如果是utf8編碼的網頁,則不需要后面的兩個參數.
獲得所有的參數使用options()
, 設置某個參數,比如stringsAsFactors
使用options(stringAsFactors = FALSE)
下面是所有的參數,供參考
options()#> $add.smooth#> [1] TRUE#> #> $bitmapType#> [1] "cairo"#> #> $browser#> [1] "xdg-open"#> #> $browserNLdisabled#> [1] FALSE#> #> $CBoundsCheck#> [1] FALSE#> #> $check.bounds#> [1] FALSE#> #> $citation.bibtex.max#> [1] 1#> #> $continue#> [1] "+ "#> #> $contrasts#> unordered ordered #> "contr.treatment" "contr.poly" #> #> $defaultPackages#> [1] "datasets" "utils" "grDevices" "graphics" "stats" #> #> $demo.ask#> [1] "default"#> #> $deparse.cutoff#> [1] 60#> #> $device#> function (width = 7, height = 7, ...) #> {#> grDevices::pdf(NULL, width, height, ...)#> }#> <environment: namespace:knitr>#> #> $device.ask.default#> [1] FALSE#> #> $digits#> [1] 7#> #> $dvipscmd#> [1] "dvips"#> #> $echo#> [1] FALSE#> #> $editor#> [1] "vi"#> #> $encoding#> [1] "native.enc"#> #> $example.ask#> [1] "default"#> #> $expressions#> [1] 5000#> #> $help.search.types#> [1] "vignette" "demo" "help" #> #> $help.try.all.packages#> [1] FALSE#> #> $HTTPUserAgent#> [1] "R (3.2.2 x86_64-pc-linux-gnu x86_64 linux-gnu)"#> #> $internet.info#> [1] 2#> #> $keep.source#> [1] FALSE#> #> $keep.source.pkgs#> [1] FALSE#> #> $knitr.in.progress#> [1] TRUE#> #> $locatorBell#> [1] TRUE#> #> $mailer#> [1] "mailto"#> #> $max.print#> [1] 99999#> #> $menu.graphics#> [1] TRUE#> #> $na.action#> [1] "na.omit"#> #> $nwarnings#> [1] 50#> #> $OutDec#> [1] "."#> #> $pager#> [1] "/usr/lib/R/bin/pager"#> #> $papersize#> [1] "a4"#> #> $pdfviewer#> [1] "/usr/bin/xdg-open"#> #> $pkgType#> [1] "source"#> #> $printcmd#> [1] "/usr/bin/lpr"#> #> $prompt#> [1] "> "#> #> $repos#> CRAN #> "@CRAN@" #> #> $rl_word_breaks#> [1] " \t\n\"\\'`><=%;,|&{()}"#> #> $scipen#> [1] 0#> #> $show.coef.Pvalues#> [1] TRUE#> #> $showErrorCalls#> [1] TRUE#> #> $show.error.messages#> [1] TRUE#> #> $show.signif.stars#> [1] TRUE#> #> $str#> $str$strict.width#> [1] "no"#> #> $str$digits.d#> [1] 3#> #> $str$vec.len#> [1] 4#> #> #> $str.dendrogram.last#> [1] "`"#> #> $stringsAsFactors#> [1] TRUE#> #> $texi2dvi#> [1] "/usr/bin/texi2dvi"#> #> $tikzMetricsDictionary#> [1] "p4912-tikzDictionary"#> #> $timeout#> [1] 60#> #> $ts.eps#> [1] 1e-05#> #> $ts.S.compat#> [1] FALSE#> #> $unzip#> [1] "/usr/bin/unzip"#> #> $useFancyQuotes#> [1] FALSE#> #> $verbose#> [1] FALSE#> #> $warn#> [1] 0#> #> $warning.length#> [1] 1000#> #> $width#> [1] 65
本文地址: http://www.bagualu.net/wordpress/archives/4912 轉載請注明