R语言基本知识
目前看的是R語言實戰這本書
1、當輸入png("lxc.png")這種需要加雙引號。但是如果在括號中多加了一個雙引號,那么"lxc.png"", R ide就會顯示是函數輸入的類型,顯示加號,原因是雙引號沒有匹配,自己輸錯了,所以遇到沒有匹配的直接輸入缺失的匹配即可。
2、但是還有一點很重要,R給人感覺就是png("lxc.png")這個好像是打開畫板,但是如果下面不畫畫是什么都沒有的,并不是說ide界面上顯示圖像了,就可以直接png()保存了,其實png就是打開畫板,然后畫圖句子使用,然后dev.off()這個函數關閉畫板才會flush到真正的文件中。同理,pdf()都是如此。保存圖片與圖片自身是否顯示無關。
3、help("sink")記得加引號。而其中sink函數的結束方法是再次輸入空參數。sink()即可。file="lxc"注意要添加雙引號。當然sink函數使用也是,先打開,然后后面的輸出才寫上,當然結束不再是dev.off()而是sink()參數空即可。
4、options(digits=3)其中options是顯示(空的時候就是顯示)或者設定R的運行環境變量。而digits=3表示顯示小數點3個數長。默認是7.
5、對普通的畫圖為:
plot(number, count, yaxt="n", xaxt="n",xlab="x 軸名字",type="b")
上述表示為:yaxt xaxt都是將數據軸的標度和標度值完全去掉,但是可以設置軸的名字,后面設置標度和標度值使用:
axis(side=1, at=c(1,3,5,6,7), lables=(ni, hao, a , man, go));等均可匹配,at表示刻度值范圍。
但是有個問題就是太擁擠的不可見怎么縮小y軸的尺寸,而縮小尺寸值是在axis()命令設置at這個參數的時候就設置,使用cex.axis=0.5就表示縮小一半。而當直接使用默認的坐標刻度的時候,那么就在plot中直接放cex.axis=0.5即可。同樣兩個地方可以用的有:cex.lab=0.5 只縮放坐標軸的名稱。 cex.main=0.只縮放主標題? cex.sub只縮放副標題。
當然上述除了axis要設置at值,還有par函數,但是該函數主要是作用于整個畫布環境,設置完后,不會對當前已經顯示的影響,而只會影響后面重新生成的圖片。可以設置,par(cex.axis=0.5, )
?
其中設置畫布大小的為:par(pin(11,7))是目前自己試出來的最大畫布。
6、對于定義的function來說,x<-function(type=1){}
這種function中的參數意思是有一個參數,如果你不輸入參數默認就是1,所以參數仍然是一個,雖然看著是個等式
7、時間函數是大寫Sys.time()這個就足以輸出了,但是如果想自己控制格式用format(Sys.time(), "%a,%b,%d,%y") 與"%A,%B,%d,%y"顯示還不一樣,后者顯示的星期和月份都是全稱,而前者是縮寫因為是小寫的a b
8、對于read.table()讀txt文件的時候,需要使用read.table("路徑加引號",seq="空格還沒識別出來")
然后讀成矩陣或者數據框。重命名其中列名用names(xxx)[n]<-c(x,x,x,x)必須是向量,不能是標量,但是單個的時候還是可以的例如單個1默認成向量1,單個字符串加雙引號默認成單個向量。且必須是xxx[n]兩者分開使用好奇怪。或者names()[1:n]都修改。
實在不會修改,還有fix()這個函數將數據框顯示成表格讓你使用。
rename(data3, c(oldname="newname".......))而 直接names(data3)是打印出原有的表頭列名字。
9、對取出來的值進行判斷是否空缺,is.na()即可對向量判斷,也可以對數據框進行判斷。
10、apply函數是對矩陣,數組,數據框的一個維度上面使用函數的,apply(x, margin, fun, ...)而sapply(x, fun, option)和lapply(x, fun , option)? 其中sapply是對任何數據都可用,而lapply是用于list專用。
11、就是說對于TRUE當參數,只能將向量類型的傳進去,例如一個矩陣10*3,怎么把矩陣中全部是數字的給輸出出來,那么就是將矩陣這個矩陣轉為由TRUE填充的矩陣,這樣就可以將其當成參數,而如果只用下標表示,那么不行。mean(!is.na(x))這樣才行。就是說TRUE值想起作用,只能以數據結構形式組織起來當成參數使用。
12、注意自己可以創造邏輯值。例如y<-c("c","b","a")是一個向量用is.na()判斷倒是能夠生成3個邏輯值。而自己用c(TURE,TRUE,TRUE)才是一個邏輯值向量。與11條相結合就可以將向量或者數據框的內容利用邏輯向量編程一個向量使用。因為涉及到數據計算的時候,有時候只能使用純數值的向量,不能使用數據框去計算。例如sd()標準差函數,只能使用vectory這種類型對于mtcars這種date.frame不能直接計算的。
13、x=read.table(file.choose())這個還讓選擇路徑。哈哈。
14、對于不規則的txt文件,那么使用readLines(“路徑”)函數,即可得到字符串向量,是真的大啊。例如自己的?chr [1:93906]有這么多行。必須得一行一行分析,首先怎么去掉特定的一些內容??
其實處理文本這些臟活是可以給python來處理的。。!!先處理了再用R來統計也行。
下面專門開始學習的『正則表達式』和『字符處理函數』https://www.cnblogs.com/awishfullyway/p/6601539.html
nchar()字符串長度。它與length()函數的區別是后者統計的是元素個數。
paste()是用于黏合多個字符串到一個字符串上的。即使有不是 字符串的內容也能轉換為字符串、
strsplit()函數正好是將字符串按照某種形式進行劃分的。是paste()的逆向操作。(參數是同樣的可以輸入以什么做間隔的雙引號即可)
substr()字符串截取函數,參數是:從子集開始位置到終止位置。就是源頭參數加兩個數字。substring()函數同樣。
gsub()字符串替代,找到sub字符串然后用新的字符串代替。而sub()函數只替換第一個發現的結果,并不會都替換的。而chartr()函數也是字符串替換。
grep()字符串匹配。搜索到后返回其位置索引。grepl()函數多了一個l表明找到索引后返回的是邏輯值。
大小寫轉換函數,toupper(), tolower(), casefold(),
?
字符(串)的格式化(定制)輸出函數:sprintf()、sink()、cat()、print()、strtrim()、strwrap()?
例子:strsplit(x, split="\\s+") ?這個效果等效于strsplit(x, split=" ")其中s+是正則表達式中所有與空格相關的空格項。
?
例子中:?num1<-grep(pattern="for finished",x)表示的是只要有個元素中含有這部分pattern內容,那么就返回這個元素的下標。只要x1<-x[-num1]其中num1是一些下標組成的數組。
怎么去除方括號內的內容??有什么命令。
gsub("\\(.*\\)","",字符串)例如這個就是匹配到括號內所有值的,替換即可。
?
1、向量就是使用c表示連接的,并且向量的元素表示就是與數組相同為:x[1]或者x[2:5]都行。
2、超級賦值<<-賦值運算符,可以在函數內給全局變量賦值。
3、查看類型mode(x)
4、矩陣往向量處變化時候,使用m<-rbind(c(), c())可以生成一個矩陣。因此矩陣含有行,列。同樣矩陣使用下標索引,但是單個元素使用兩個下標,而想找一行或者一列的,那么使用的下標是:? ?逗號和一個值。 m[,1]表示第一列。而創建矩陣方法:m<-matrix(vector,nrow=, ncol=, byrow=TRUE, dimnames=list(rname,cname))? 其中rname cname分別是字符串向量。此時涉及到了一個行列名稱問題,但是還沒有學習list的。
5、矩陣都是2維的,而只有數組才是可以使維數超過2維,但是數組同樣是同類型的元素。a<-arrary(vector, dimensions, dimnames)? 其中vector是數據,第二個是數值向量。第三個是名稱列表。已經說明了其內容。
6、列表list是與向量很像,但是每個元素都可以擴充為一組元素組成的向量(向量可以由不相同的元素組成,只是都看成字符而已)。所以才會出現list(rname,cname)這樣才是將其按照同等地位組合在一起,很多時候是一個函數的返回值,更像結構體,各種類型都可以放進去返回,例如hist(Nile)這個返回值就是一個list類型。而list的訪問也是使用mingcheng $xxx? 例如:x<-list(u=2,v="abc")那么x$u就是2.
注意也就是list使用美元訪問,但是也是在有listname情況下,如果沒有listname的話,是不能使用$的。。。只能使用雙方括號!!![[ ]]。然后選中一個小組件,然后再用另外方括號選擇更小的內部例如:x[[1]][2]和y$u[2]效果是一樣的。都是選第一組中的第二個元素。? ? ? ? ? ?數組矩陣是為了使用數據的幾行幾列,而list是為了更簡便粗暴地包含更多元素內容。
list也很特殊,當元素相同時候,可看成向量,不相同的時候,可看成數據框,不看成向量即可。
7、數據框? ? ? ? ? ?數據框其實就是列表,只是數據框是以不同類型元素的數組類型表示的。可以看成由同一列構成的向量當成list的每個成員。。。內容都一樣,只是組織形式不一樣,有時候統計員工信息,肯定數據框更方便顯示,但是硬把每一列當成向量。而數據框要當成數組使用,所以訪問元素使用下標要更好的。
d<-data.frame(list())這種方式組成數據框,也能看出其與list相同。而數據框一般是通過讀取文件和數據庫得到的。
使用方括號取值,不同級別才用[][]類型,例如list中的矩陣類。而相同級別的使用[x,y]這種。。數據框中直接p[1:2]取值,表明取1和2列。。類似于list.
8、因子是為了給向量進行分類,并將其存儲為級別的數據對象,
9、R語言類的意義:就是函數會根據數據類型的不同,做出不同的處理,例如summary()函數,自己就不用擔心數據類型。
10、read.table()得到的是數據框類型的r對象,
11、可以使用attributes()列出所有組件。而str()? mode()都是一種打印,而summary()打印的信息更詳細。 typeof()是查看數據類型。
12、R都是使用一種方法解出一種答案。
13、想得到函數help函數名不用加雙引號,但是如果是特殊字符或者一些保留字例如for那就要加上雙引號查詢了。
14、example(seq)這個就是給你一系列使用方法,而畫圖總example(persp)就是各種等高線圖。按回車鍵就是下一個圖片顯示。
15、谷歌搜索技巧:filetype:R? permutations -rebol? 表示搜索文件類型是R的語言腳本,并且排除rebol類型。
16、自動補齊,能看出來。20位加上1:2就是自動補齊。? 向量化就是函數對每個元素應用函數。 查找向量的一部分。
本來R中可以不定義就使用,但是涉及到部分成員,那是不行的,y[1]=5就不對,必須y<-vector(length=2)然后賦值。y[1]? y[2]? ?即可。等效于y<-c()
17、R語言中運算符都是一個函數,所以可以做向量式運算的。
18、很重要向量的取部分使用的索引:? 向量索引:? 向量1 [向量2]? 返回的是向量1中索引為向量2的那些值。 下標可以重復使用,符號代表刪除
19、符號:也可以創造向量的!!! 冒號比加減更有優先級。輸入?syntax就可以顯示出符號優先級。? seq也可以創建向量。但是seq還有個用途就是參數非空的時候,seq(x)與1:length(x)等效。即使x<-c(5,11,9)都可以得到的是:seq(x)是1,2,3
20、req()函數同樣可以生成一個向量。
21、any() all()函數都是判斷邏輯值的。
22、round函數是四舍五入。
23、sapply()函數是對向量使用,然后返回矩陣類型。
24、在函數中加上na.rm=TRUE就可以將na無效值給刪除掉。
25、%%求余運算。 NULL是什么都沒有,而NA是會一直存在,只是表達無效而已。所以a<-NULL 時候a<-c(a, 1)這種是會不顯示NULL的,但是NA的話還是會在的為NA,1
26、z[z*z<8]表示的是索引為布爾值向量。所以可用有效。
27、向量x中所有大于3的值替換為0那么一行就可以x[x>3]<-0
28、subset的刪選可以去掉NA,? subset(x, x>5)
29、which(z*z>8)返回的是下標組成的向量。當然也是根據布爾向量判斷出來的下標。
30、就是看著的ifelse(b,u,v)同樣是對b,u,v這三個向量中每個元素進行的判斷!!!!
31、判斷兩個向量是否相等,使用==是對每個元素判斷,這樣不好。而all()? identical()函數則是完全判斷成一個結果。但是identical有點太謹慎,同樣值是1一個整數,一個浮點數,雖然值都是1也不行。
32、name()函數是查看名字或者命名,而name(x)<-NULL則是去除名字。
32、注意,R語言是可以比c語言少for循環的,因為其可以向量化的特征,所以很容易從向量集中得出某些特征的值。但是如果涉及到重新排序的類似操作,那么必須得有個新的向量被定義出來使用,原向量只是操作對象。例如找到每個單詞的出現次數,就是將單詞作為標簽創建一個新的list即可,然后在此基礎上還能排列詞頻順序,使用order返回的是對應的索引值!!這樣就簡化多了,因為將order結果直接用于向量索引就是新的向量或者鏈表。
33、還有,由于數據框要比list約束多,當然數據框是隸屬于list的,所以數據框可以使用list的訪問方式訪問數據框,但是list卻不能使用數據框的矩陣訪問方式。因為數據框就是比list多出一個矩陣結構。,
34、subset函數里面是有兩個參數的,第一個是數據集,第二個是判斷條件,而平常是將判斷條件產生的布爾向量當成索引的,但是為了防止NA的破壞,所以使用subset自動刪除NA
35、complete.cases是對數據框中的行進行NA判斷產生布爾值的。可以用于刪除NA的索引。
36、對于數據框可以使用rbind和cbind.但是添加的長度要符合原數據框。添加也可以直接list$a<-就算是添加了。多用于類似矩陣的數據框添加新列等操作。
37、前面提到apply一般是用于向量的,因為向量的類型相同,而apply也可以用于數據框,只是要求數據框內容要完全類型相同,例如對于數據進行mean計算。apply(frame, 1, hanshu)表示對每一行進行hanshu操作。
38、一般來說,數據框的數據處理,是想使用因子的,而list的使用是不想使用因子,如果read的字符串不想當成因子,那么使用stringisfactor=TRUE,true表示不當成因子這個有點相反的意思。,
39、merge()用于合并有相同列名稱的兩個數據框,還有by.x? by.y兩個參數,用于指定合并數據框中值相同但是名稱不同的情況。這樣就可以按照指定來合并了。merge(a,b, by.x=行數,by.y=行數)
40、判斷數據框中每個記錄行是否有相同的長度,使用count.fields("數據集", sep=",") 就可以得到每個記錄行的長度,然后使用all判斷上述結果向量是否全部大于某個值。。
41、如果對數據框使用lapply那么就是用于數據框的每個列!!!并且返回值成了列!!!
42、當你想按照某個列的值排序并保持數據框中的變量關系不變,例如一個人的年齡還是這個人的年齡,不會變錯位。那么就要使用因子了,所以因子適用于數據框是有原因的。。
43、因子對應的是統計學中的名義變量或者分類變量。,本質不是數字,
44、因子可以看成是包含了更多信息的向量。更多的信息一般是指不同的level.? 可以使用factor函數將向量變為一組因子。例如x<-c(5,12,3,12)得到的因子是3個level。cf<-factor(x)cf只有三個level但是length(cf)顯示的是實際數據長度不是因子的level長度
45、因子向量,首先包含的是數據,只是根據數據,然后進行的因子分類,所以包含的數據就是數據,只是factor因子化后多包涵了特性,levels而已。所以在給因子向量添加levels時候,是不顯示在數據中的。直到添加真正數據,而一旦成因子再添加不存在的level的數據就會報警告被識別成NA。所以需要加入新的level,而加入新的level看著好像是加入數據,其實是level,雖然他們的值相等。加入level為:newf<-factor(原向量, levels=c(a,b,c))像這樣加入新的level值,才能用newf[3]<-數據。 這種給值改數據。
46、即使是向量你認為只有20這么長,但是使用f[21]<-數據? ?那么就可以得到數據的增長。沒有問題的,前提是有個f已經存在了。那么輸入f[23]的數據,此時22處的數據就默認是NA了。長度是23.
47、tapply(x, f, g)用于針對某個因子對某個數據集合進行某種函數的操作,所以可以看到是三個元素。數據集合(數據框中的一組向量!!!不能是數據框本身,例如對工資統計平均值。只能是工資數據。因子為年齡和性別兩個即可。),因子列表,函數g
其中x的向量的元素個數要與f因子向量的元素個數相同。因為按照因子向量分配的,不能x樣本中有逃離在f因子level之外的吧。當然因子可以是兩個因子。使用list(因子1,因子2)
tapply的核心是將數據按照因子分成不同的數據組,然后對每組使用指定函數。
并且f這個值可以是list例如:list(c(1,2,3),c(a,b,c))就是說按照兩種因子進行分類,就類似與按照年齡和性別分別對工資歸類。!!并不是單純地當成123abc? 這樣6個等效的向量。是兩個分類標準因子。
48、而split是只做tapply的分組步驟,就是分類使用的。但是split(x,f)中x可以是數據框。split返回的值是列表類型。因為tapply是使用函數計算,所以返回的是值。
49、排列文本,那么使用split(1:length(x), x) x是一個列表時候,即將順序數字按照x的因子類型分類,這樣就將txt文本內容按照相同值將其位置歸納到結果的同一個list元素中了。
50、將數據框數據變為向量來處理,為:ee<-as.matrix(x)? dd<-as.vector(ee)即可。
51、by函數與tapply函數是類似的,區別在于by函數的x可以是任何類型,不再是一個向量的約束了。
52、lm()函數是組線性liner model 就是這種線性擬合的,對兩列值得出線性表達式的參數值。例如:lm(a~b)? 就是對a=kb+c進行擬合。
53、table函數適用于統計:將每個向量都當成因子向量來分別分類,然后做成矩陣圖表示發生的次數。例如:f<-list(c(1,2,3), c(a,b,c))。 table(f)表示的是把f當成因子向量進行統計,得出一個3*3統計次數的矩陣。主要用于統計發生次數。例如既是1又是a的次數1.? 當然table的參數可以是數據框,畢竟list與數據框都類似。統計的類型都是單個人以行統計,就是一行是一個人的所有信息,而統計的是按照所有信息分類的人數之和。
54、說的表就是有table函數生成的,由于table函數是生成的數字,所以表就是數據矩陣或者數組,當然可以用矩陣方法提取子表了。
55、對于一個向量也可以使用table函數,將其轉換為表。而tabdom(表, 個數)? 表示找出表格中頻數最高的幾位。
56、cut用于生成因子,cut(x, b, labels=FALSE)? 表示x是數據向量。b是范圍集合。產生結果:表示x的值落在哪個區間。這些數結果組成的向量。
?
?
?
1、編程結構:
1、循環:
for(i in x)表示的意思是循環會對x向量中的每個元素進行一次迭代。i會取遍 x[1]? x[2]等
R語言中沒有分號,就是一行一個計算。但是有大括號。 也有while repeat break都可以使用。repeat{ i<i+4? ? ? ? ? ?if(i>10) break}
當然有自己獨特的next .用于類似continue,就是此次for循環next下面的后面的都不再執行重新下一次for循環。
2、scan()函數中填入文件名。只能填入文件名字。
3、但是很明顯,R不支持非向量集合的循環,但是有些間接方法。例如lapply可以對每個列進行。
get函數,get接受的參數是非向量集合組成的字符串參數,例如get(c("fei1","fei2"))
4、if else即使只有一句話,也要寫大括號,而且判斷語句只能是邏輯值不能是邏輯向量!!!!
5、標量的邏輯與 或? ? ?向量的邏輯與 或? 是不同的,前者是雙個&&,或者是單個。且結果前者是值后者是向量。
6、返回值有多個的情況,可以將結果加在list中返回。
7、t<-function(x) return (x^2)??
? ? return t
這個返回值就是返回一個函數。。。所以返回值類型有好多的。
8、函數都是對象。 而函數范圍很廣,{都可以看成函數,,作用是將幾個句子組織成一個單元。函數定義的兩個參數可以銅鼓formals()和body函數得到,第一個得到參數,第二個得到函數體。g<-function(x){}? ?那么就是formals(g)? ?body(g)
9、當要查看的函數之類很長時候可以使用page(abline)使用頁看。
10、改變函數主體使用body(g)<-quote(2*x+3)如果少了quote這種帶call性質的引用,那么就會出現g直接是一個值而不是一個函數。。
11、ls()函數會打印出目前環境下所有的變量,對象。還有ls.str()表示目前環境下對象的詳細內容。
12、找函數的運行范圍,是從近處開始,然后往外圍上層找。
13、print(ls (envir=parent.frame(n=1)))? 表示為當前環境網上升一級。
14、與c語言一樣,函數不會修改非局部變量。總是拷貝一份然后執行。原來的并不改變。只有superassignment opertator這個超賦值運算符才可以。<<-? 和assign()才能在局部變量處對非局部變量進行修改。但是<<-和assign只是標識要對調用上一層進行賦值并不是一定到最頂層!!!
15、showframe()就是函數帶一個參數,代表調試時候想看上幾級的變量內容,里面數字是幾就是往上幾層的框架 數目。showframe()其實就是調用的parent.frame()這個函數,而且,ls(envir=env)表示指定特定的層次的調用。
16、R中沒有指針體現在x<-c(3,2,4)那么執行sort(x)后出現的是一個值但是并沒有改變x的值,x仍然是原值,但是python就可以改變。。。只能重新給x賦值為:x<sort(x)? ?如果輸出包含很多變量,那么怎么辦呢?只能用list來做變量,然后傳輸list即可。
17、一個函數中定義f<-function(u){u<<-u*2}
那么當x<-2? f(x)時候只是將x這個值傳進去,當然計算的是u=4并不是x=4.所以不論傳進去的是什么,都是一個值,不是一個變量!!!!!然后會在調用f的上層環境中多出一個u=4的值,而不是變量x。
18、再次強調x[-1]出現負號表示的是將第幾個值扔掉!!!!
所以quicksort自己用R編程,當然可以直接用sort就是快排。
qs<-function(x){
if(length(x)<=1) return ( x)? ? ? ? ? ? ? ?注意同樣是相等用==兩個等號這種來判斷!!!!
19、是挺厲害的,可以自己定義類,然后類內部自己重新定義常規的"[."和"[<-"這兩個操作。是"[.newclass"<-function(){}操作和 "[<-.newclass"<-function(){}。
20、將自己的文本后綴是.R 的代碼加入是:source(xxx.R)即可。? 如果想單純修改下已經在環境中的f1()函數,或許edit(f1)會單獨有個框修改,不影響目前。或者想拷貝一份再修改,那么更要用edit為:f1<-edit(f2)即可。
21、創建自己的二元運算符,例如:? ?"%a2b%"<-function(a,b) return (a+2*b)
那么就可以使用:3? %a2b%? 5 結果是:13
22、f<-function(x) return(x+2)? ?這個過程是先定義一個函數,function定義的,然后把這個函數賦值給f,注意f叫做函數名,而return(x+2)并不是返回給f,而是將function(x) return(x+2)整個無名稱函數給了f,這樣自己使用時候用f(2)這樣就是調用f函數名。而在apply函數中直接調用function(x) return(x+2)例如:apply(x, 1, function(x)return(x+2))就是匿名函數的用法。而apply(x, 1,f)就是非匿名函數的用法。因為apply的第三個參數必須是函數,所以使用匿名或者有名的都行。其實function(x) return (x+2)有沒有return都一樣的,因為僅僅一個表達式就能返回,自帶返回函數。所以不帶return就行,并且賦予f的是一個函數,并不是x+2而是整個函數形式。即function(x) x+2 才是完全的f.
?
一、數學運算和模擬
1、exp()是以e為底的指數函數。 log()自然對數。log10()以10為底的對數,sqrt()平方根函數? abs()絕對值。sin? cos
min() max()? which.min()? which.max()表示最大最小的位置索引。pmax() pmin()比較所有等長向量中位置在k處的最大值或者最小值。sum()? prod()是求向量和和求向量積。cumsum() cumprod()表示對一個向量前k個元素進行求和和求積,是分別計算k從1到length(x)的方法.例如x向量有10個元素,那么給出10個結果。。round() floor() ceiling()分別是四舍五入, 向上取整,向下取整。 factorial()是階乘。
在求向量的最小最大值后,還有nlm()? ?optim()來得到函數的最小值和最大值。但是需要給函數先設定一個初始值,這樣nlm或者optim才可以進行收斂得到。
微分積分:
derivative 和integrate()
D(expression(exp(x^2)),"x")? 表示是e的x^2次方進行對x進行求導。即表達式和求導對象
integrate(function(x) x^2, 0, 1)? //默認是對x進行求積分。表示對x^2這個表達式進行從0到1的積分。
上述兩者區別是式子分別用expression和function表達。
?
其中R的odesolve包提供處理微積分函數,而ryacas包提供了R與yacas符號系統的接口
2、統計分布函數
函數名有一套統一的前綴名字。
d表示概率密度函數
p對應累計分布函數
q代表分布的分位數。
r是隨機數生成函數
然后常規分布函數名稱: norm()正態分布, chisq()卡方分布 , binom()二項分布
上面的四個前綴都可以與這些分布函數名字隨機組合
模擬生成1000個自由度為2的卡方隨機變量,再求其平均值
mean(rchisq(1000,df=2))? ?
這個rchisq表示從卡方隨機分布中隨機生成1000個數,這些帶有前綴R打頭的分布函數第一個參數是個數,后面就是自己所屬的分布族自身帶有的參數了。例如df是卡方分布的參數表示自由度。?
想查詢使用? ? ? ? ? ? ? ? ? ? ?rchisq即可。
3、sort()排序但是不改變原值。order()
對數據框進行排序,是:order(list&one)然后將得到的位置當成行位置指導 list[order(list&one),]表示的就是以one列進行的排序方式將每一行重新排序。
rank()還能得到每個元素的排序大小,表示按照從小到大在整個向量中處于第幾位。而同樣大小的,分列3,4位,那么結果就是分別排位值為3.5都是相等的。
4、向量和矩陣的線性代數運算
普通向量與標量相乘是*即可。但是如果想計算兩個向量的內積。使用crossprod(x, y)函數即可。
矩陣乘法是:%*%而不是*
solve()函數求解線性方程,即將線性方程先用矩陣將其表示出來,然后solve(x,y) x表示等號左邊。y表示右邊值。而只加入一個參數的solve是用于求解矩陣的逆矩陣。
關于矩陣的計算還有很多函數,但是自己已經忘記了好多。t() qr()? chol()? det()? eign()? diag()//該函數有兩用性 sweep()?
其中擴展的示例:向量的叉積。則很好。行列式是一個與矩陣類型相關的函數,所以說行列式是用一個復雜函數計算得到一個值的過程。記住三維的行列式計算就可以了。其實是個迭代的過程,-1的k次方再乘以子矩陣的行列式det(子行列式)
只有方陣才有特征值,和特征向量,要不然不能匹配個數:特征空間包含所有的特征值。雖然說的是矩陣,但是核心是拉縮向量,但是特征值和特征向量就是從矩陣得到的,雖然叫矩陣的特征值特征向量其實這兩個值就是為了總結矩陣的。
Ax=入x? 其中入是一個數值,x是一個向量,列類型,那么為了元素個數匹配,那么只能A為方陣與x相乘,然后得到一列值。
矩陣乘以向量的作用就是對向量進行的一個拉伸或者扭轉的結果。。是以向量為核心的,這才是矩陣的意義(例如矩陣乘以一個向量后變成另一個向量。)。而特征值和特征向量是找出能讓該矩陣只拉伸的向量(就是特征向量),且其拉伸程度!!!!程度就是特征值,。一個矩陣的一組特征向量是一組正交向量(什么是正交向量),正交向量是指兩兩正交。而正交是向量相互垂直,判斷方法是:
?
向量的內積也叫點積意義是:正交是內積。不是叉積。正交表示兩個向量垂直。
向量的叉積:就是使用行列式方法的乘積。兩個三維向量的叉積結果是新的三維向量
?
5、集合運算。
求并集union()? intersect表示交集。setdiff()表示差集,誰在前表示以誰為主,在前面參數中不在后面參數中。setequal(x,y) 檢測集合x和y是否相等。
c %in% y? 不是函數,是判斷元素c是否在y中,返回一個布爾變量結果。
自己定義函數時候,長名字使用雙引號添加!!!"長名字"<-
combn()函數用于一個向量產生指定個數的所有向量集合,產生的結果是按列組成的矩陣。combn(1:3, 2)? 也可以指定一個函數對于得出的子向量集合進行操作。combn(x, 2, sum)對每個結果進行求和。
6、x<-rbinom(10000,5,0.5)即一個二項分布(n次獨立實驗),每次結果只有兩種可能,并且產生的是x值是每5次結果中正面朝上的次數。。所以找到x向量中大于4的次數。求平均值就是硬幣四次都是朝上的概率。函數生成的是隨機變量結果集合。
雖然好多概率可以用公式計算,但是R還可以模擬,做百萬次模擬得到結果。這個很厲害的。
一、類
1、R中從數字,字符串,矩陣都是對象,是類的實例化。R支持封裝(是把數據封裝為一個類實例。),多態,繼承。
S3是原始的類結構。一個s3類是包含一個list并且有類名屬性,和dispatch調度(調度功能使泛型函數成為可能)。什么是泛型函數?就是含有多態的函數都叫做泛型函數。
例如print()函數。如果識別出來對象是lm類型類,那么調用的實際是print.lm()函數。
unclass(函數)是表明,去除函數的類聲明,顯示出核心輸出部分,手冊看的更清晰一些。
methods()里面放泛型函數可以顯示出來真實包含的所有實現方法,例如print可以顯示n多,print.acf* ....等。但是對于print.aspell*這種帶星號的是不能顯示出來的,即只能使用aspell讓系統默認調用print.aspell但是如果自己顯式調用的話,print.aspell會報錯找不到,那么就只能使用getAnywhere(print.aspell)找到。
?
讀寫:
scan是只識別空白符號,而且只能識別為數字或者字符二選一。所以這些限制著不能讀成數據框形式。
read.table卻是可以讀成數據框形式,要變矩陣使用as.matrix變化。或者使用scan讀成向量再把向量切割成matrix。
read.table一定是可以根據空格和回車來識別文件。
c<-file("1.txt","r")
readLines(c, n=1)注意,是遇到EOF停止,但是可以讀取空的行,并不會忽略空的行。
close(c)表示關閉。
人口普查,可以提取某個數據量組成數據框。很方便。
提取字符串方法:substr(s, 起始數字,結束數字)然后再使用as.integer(sbustr())結果,表示是數值。
都到這時候了list還不清楚?list(gender=c(1,2),age=c(15,16))然后names(list)
1、還是要實踐,例如矩陣,數據框類型就可以rbind? cbind等函數,而向量,list只能使用list$xx? <-數 或者 NULL? ?等函數。而且list的索引是數字或者[[加引號的名字]]? 而由于向量是連續的!!!所以不能使用添加刪除,只能 重造,c<-c(c[3:4],xxx,c[5:6])這種。
所以制作數據時候,先定義數據類型再使用d<-data.frame()然后d<-rbind(d, listxxx)才行,只要保證list的個數是相同的即可。不能d<-rbind(list1,list2)這樣不首先對d定義,得到的d沒有作用。。因為list不能使用rbind.
2、新建時候,list使用? ? ? ? ? l<-vector(mode="list", length=5)表明是5個長度的list。使用時候,for (i in 1:5)? ? ? ? list[[i]]<-socketconnection()
同樣,寫入文件,使用數據框操作或者矩陣操作,就用write.table(data.frame, "文件名")即可,如果寫入矩陣那么就是需要:人為去掉矩陣的行列的頭。 write.table("data.frame", "wenjianming", row.names=FALSE, col.names=FALSE)? ?而且stringAsFactors=FALSE是大寫波浪式的。
writeLines(xxx, c)同樣是內容和connection. 并且connection建立時候使用"w"然后使用close(c)關閉connection。
?
對文件的操作:file.info()這種可以顯示文件的大小,創建時間,是否為目錄等。
dir()返回一個字符向量。列出第一個參數指定目錄下的所有文件名稱。使用getwd就可以看見目錄,然后加入dir中即可。如果里面加入recursive =TRUE那么就會出現整個目錄樹。
不希望scan()輸出讀的個數加上quiet=TRUE.
與網絡連接同樣需要使用socket連接。
?
一、
字符串操作:
grep("pattern" , 向量) 返回的是向量中能匹配pattern的索引。? nchar("字符串")返回字符串長度,注意R字符串長度沒有最后結束符。past是粘貼起來幾個字符串。s<-sprintf("xxx%d is %d\n", i,i*2)這種是按照格式輸出到s中。substr(x,? 起始位置, 終結位置)。strsplit(x ,split="-")使用字符串中已有的-來分割。regexpr("pattern", text)返回pattern在text中的起始字符第一次匹配起始字符位置。而gregexpr()與regexpr很像是返回所有匹配字符開始位置,前者是只返回第一個起始字符位置。。
grep("c.e","acxecue")像這樣,只會將后面引號中當成一個向量元素,返回的也是一直是這個向量元素位置,有了就只能是1沒有就是0。是以向量為單位的。
grep("pattern", xxx)這種正則表達式使用方法,當pattern是[au]時候表示字符串中有a或者u的。? pattern? c.e其中.表示任意一個字符。c..e表示中間有兩個任意字符。
如果想查找.句號本身,那么使用"\\."因為反斜杠自身也是元字符屬性。
strsplit(向量,? ?"."? , fixed=TRUE)帶上fixed=TRUE表示的是不把.當成正則表達式。看來正則表達式是默認生效不僅是在grep這個查找中生效。當然效果與使用 \\.是一樣的。
當然還有個問題:paste("a", "b")是有空格的所以如果使用paste產生名字變化的pdf文件,那么會出現空格,在paste中多用seq=""來控制無空格。
另一種方法是使用sprintf()函數。只是注意,使用浮點類型時候,%g去掉了數值的多余的0.
一、繪圖
最基本的plot
plot(c(),c())表示的分別是x,y軸的值組成的點。這是最簡單的圓點。開始逐步加入復雜的修飾。
point character=pch 值表示不同的點形狀。
plot函數是分階段執行的,所以可以加入坐標。plot(c(-3,3),c(-3,3),type="n", xlab="x", ylab="y")
該命令只是添加坐標軸。必須xy軸坐標相同,并且這個type是n決定了不畫點只畫畫布。這個自己寫錯了,是c(a,b)不是c(a:b)代表的是如果有type=n就是只畫圖的范圍。這樣就不會再提示不匹配了。當然無type=n是當成點的,并且n y x這些等號后面的值都要加雙引號。
添加線條:abline()? 這個函數里面是一個線例如lm(y~x)結果。按道理abline()參數是截距和斜率。但是如果判斷出來是回歸線,那么會將回歸線的斜率截距提取出畫圖的。一般abline會將結果加在目前的plot圖中。
lines()由于已經確定是直線,所以使用兩個點向量參數(內部是x,y值)作為參數即可畫出線。但是如果不想要點,只要線,那么加上type="1"
目前只能在圖上加線,但是一旦重新加點plot調用就更新畫布了。。。。
新增個窗口:windows()? x11()
畫兩條線的確實是先用plot然后用lines。或者abline()此時需要注意先畫范圍比較廣的圖線,然后把小圖加上,這樣才不會超范圍。
有增加點的,!!!points(c(),c(), pch="+") 就是添加points,添加前兩個指定向量對 的。
使用text((x,y),"name")例如加標簽,指定位置x,y然后加上名字。legend()加圖片,可以輸入quit來停止顯示。
locator(1)locator(2)分別可以顯示出自己鼠標點的坐標點值。2表示可以得到兩個點擊的坐標值。并且不用復制,只用text(locator(1),"wenzi")這樣點擊就能填上文字。
plot(c(-3,3),c(-2, 3))這個操作既畫點也畫坐標軸。自己的圖發現已經不能再大了,所以需要定制圖了。
也說了,想撤銷最好用source(.R)方法。
定制方法:
cex=1.5這個參數可以放在text或者plot任何畫圖的命令中當參數。。坐標軸更長同樣在命令中使用參數:ylim=c(0,90000)表示起始范圍。
curve可以繪制函數中一段內容。在現有的圖中想添加,那么使用curve的參數中加入add=T
確實兩次調用就顯示顏色重了,但是自己想專門放大。怎么辦?抄人家的源代碼
?
保存:dev.list()可以看到有幾個設備。一般是一個畫圖的,一個標準命令的。然后顯示dev.cur()看活動的是哪個。想保存誰,就dev.set(n)是設定激活目的窗口。然后dev.copy(n)就是將現在活的屏幕內容拷貝到括號內的設備中,然后關閉設備dev.off(n)關閉對應的才可以真正寫入。
?
三維圖:persp ,wireframe() cloud().
?
調試的時候,使用stopifnot(x>0) 與assert很像。print確實使人很煩,R包含了基本調試工具,確實,輸入debug(hanshumingchneng)就出現了下次調用hanshumingcheng時候自動跳到browser這個debug環境中。還有一種是,不想函數開始就調試,而是函數大概位置,開始插入browse()這樣,到了就debug,函數結束停止。兩種調試方法。還有改進debug方法,就是因為每次debug完了還要undebug,很麻煩,使用debugonce()
Q是退出,然后n是在browser下與gdb一個命令。c是退出循環或者到下一個暫停點,暫停點是browse位置。并且可以browser(x>0)表示大于0是才進入調試。還有一個即使 正在調試,不用退出加break而是setBreakpoint(x.R , 28)表示對哪個文件第28行加斷點,此處加斷點是進入browser模式調試的。。
不想要斷點了,就看在哪個函數中,然后untrace(那個函數)。
當已經崩潰的時候,可以調用traceback()函數,然后看看卡死在哪。
當有n與命令重復,那么使用print(n)來打印n的內容。
使用save保存注意要輸入save(xx, file="xx")??
定義函數的時候不用加括號,只是調用的時候加上參數即可。
注意每次edit編輯的時候前面一定要加上目的函數,然后最后將函數再次執行save,保存到文件中,因為edit是編輯的內存中的,編輯完并沒有保存,只有賦值給自己定義的名稱才有效!!!!!!!
?
?
?
總結
- 上一篇: dnf如何快速拾取物品_DNF宠物之最,
- 下一篇: H.264编解码浅析