版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第1章數(shù)據(jù)分析基本概念數(shù)據(jù)與變量的類型數(shù)據(jù)是一切可以表示信息的符號,例如數(shù)字、文本、日期等等。變量一般表示某個事物的屬性,而數(shù)據(jù)就是變量的具體取值。例如描述一個人的時候,年齡、性別、身高、年收入都是變量,而18歲、30歲是數(shù)據(jù),是變量年齡的具體取值。從數(shù)據(jù)分析的角度看,變量的類型有:連續(xù)性的變量比如,身高,體重,化驗值等等,可以進行計算。其中一種數(shù)據(jù)只可以進行加減運算,不能進行乘除運算,我們稱之為等距數(shù)據(jù),其0值只是相對的,而不是表示沒有。例如溫度,我們可以說20攝氏度比5攝氏度高出15攝氏度,但不能說多4倍,0攝氏度也是有溫度,而不是一點溫度都沒有了。等比數(shù)據(jù)是可以四則運算的,其0值有絕對意義。例如網(wǎng)站的日訪問量,0訪問量就是代表沒有人訪問,微信上的推送閱讀數(shù)2000可以說比500多1500,也可以說多4倍,這個倍數(shù)是有意義的。分類變量其變量值是定性的,表現(xiàn)為互不相容的類別或?qū)傩?。實際上在調(diào)研當(dāng)中運用最多的就是分類變量,可分為無序變量和有序變量兩類。①無序分類變量是指所分類別或?qū)傩灾g無程度和等級順序的差別,例如二項分類,性別(男、女),藥物反應(yīng)(陰性、陽性)等。例如多項分類,血型(O、A、B、AB),職業(yè)(工、農(nóng)、商、學(xué)、兵)等。②有序分類變量是指各類別之間有程度的差別。如尿糖化驗結(jié)果按-、±、+、++、+++分類;療效按治愈、顯效、好轉(zhuǎn)、無效分類。注意在分析中判斷好數(shù)據(jù)的類型,一種常見的錯誤就是認(rèn)為數(shù)字就一定代表連續(xù)性變量,例如我們可以用1和0表示性別男和女,這里的1和0就不是連續(xù)性數(shù)據(jù)。再例如某問卷調(diào)查中,采用五級量表,分別用1到5表示非常不滿意、不滿意、一般、滿意、非常滿意的五種態(tài)度,這里的1和5就是有序分類變量。數(shù)據(jù)的描述平均數(shù)平均數(shù)是指反映一種數(shù)據(jù)集中趨勢的度量,其值是樣本中所有數(shù)據(jù)之和除以樣本個數(shù)。計算公式為:μ=中位數(shù)中位數(shù)是指數(shù)據(jù)分布中處于中間位置的數(shù),其可將數(shù)值集合劃分為相等的上下兩部分。對于有限的數(shù)集,可以通過把所有觀察值高低排序后找出正中間的一個作為中位數(shù)。如果觀察值有偶數(shù)個,通常取最中間的兩個數(shù)值的平均數(shù)作為中位數(shù)。平均數(shù)與中位數(shù)比較一般來說,平均數(shù)是被認(rèn)為最好的數(shù)據(jù)水平的描述,應(yīng)用也最為普遍。但是平均數(shù)對出現(xiàn)極端值的情況處理不如中位數(shù)。如下例:A組年收入數(shù)據(jù)(1000,4,3,2,1)B組年收入數(shù)據(jù)(6,4,3,2,1)A的平均數(shù)是202,B的平均數(shù)是3.2,AB兩組的中位數(shù)都是3,顯然在這種情況中(A組出現(xiàn)極端值),中位數(shù)比平均數(shù)更能反映一組數(shù)據(jù)的水平。對于出現(xiàn)極端值的情況,我們可以采取同時計算平均數(shù)和中位數(shù)的方法來表述數(shù)據(jù)的水平,也可以采用去除極端值后再計算平均值的方法(較多采用),從而得到相對準(zhǔn)確的估計。有必要提醒的是,對于極端值出現(xiàn)的情況進行細(xì)致分析,往往能得到有價值的結(jié)果。四分位數(shù)四分位數(shù)是把所有數(shù)值由小到大排列并分成四等份,處于三個分割點位置的數(shù)值就是四分位數(shù)。從由小到大的順序,處在第一個分割點位置的數(shù)叫下四分位數(shù),第二個分割點的就是前面介紹的中位數(shù),第三個分割點的就是上四分位數(shù)。在一組數(shù)據(jù)中,有四分之一的數(shù)據(jù)小于下四分位數(shù),四分之一的數(shù)大于上四分位數(shù)。例如數(shù)組(2,5,7,8,9,10,12,15,16,17,19,21,22,25,30),下四分位數(shù)是8,中位數(shù)是15,上四分位數(shù)是21。對于四分位數(shù),箱線圖可以比較好地反映了數(shù)據(jù)的分布,典型的箱線圖結(jié)構(gòu)如REF_Ref413742321\h圖11所示。圖STYLEREF1\s1SEQ圖\*ARABIC\s11:箱線圖標(biāo)準(zhǔn)差標(biāo)準(zhǔn)差是反映一組數(shù)據(jù)離散程度的數(shù)據(jù)度量,在數(shù)據(jù)分析中具有重要地位,應(yīng)用非常廣發(fā),是各種統(tǒng)計檢驗的基礎(chǔ)。例如AB兩個網(wǎng)站上投放廣告在6天的點擊率如REF_Ref413743363\h表11所示廣告點擊率2014/1/12014/1/22014/1/32014/1/42014/1/52014/1/6A網(wǎng)站455565755070B網(wǎng)站30680402004表STYLEREF1\s1SEQ表\*ARABIC\s11AB兩個網(wǎng)站投放廣告6天點擊率數(shù)據(jù)經(jīng)過計算,A和B網(wǎng)站6天內(nèi)的廣告點擊率的平均數(shù)都是600,僅此是否可以得出結(jié)論這兩個網(wǎng)站的廣告投放效果是相同的呢?答案是否定的,從數(shù)據(jù)上初步觀察,B網(wǎng)站上廣告點擊率數(shù)據(jù)顯然更為分散,而A網(wǎng)站上的廣告點擊率數(shù)據(jù)相對更穩(wěn)定些,從可以看出這一區(qū)別:圖STYLEREF1\s1SEQ圖\*ARABIC\s12AB網(wǎng)站廣告點擊率數(shù)值分布圖本例中僅僅包含少量數(shù)據(jù),如果對于大數(shù)據(jù)集合的穩(wěn)定性,靠觀察比較還是不夠的,用標(biāo)準(zhǔn)差來描述更為合理,標(biāo)準(zhǔn)差的計算公式為:其中σ表示標(biāo)準(zhǔn)差,N是樣本數(shù)據(jù)個數(shù),μ是樣本平均數(shù),xi表示樣本中第is個數(shù)據(jù)。公式計算過程語言可描述為:將每個數(shù)據(jù)與平均值之差的平方進行求和,再除以數(shù)據(jù)個數(shù),最后求平方根,所得的結(jié)果即為改組數(shù)據(jù)的標(biāo)準(zhǔn)差。因而AB兩個網(wǎng)站點擊率的標(biāo)準(zhǔn)差分別為:A=為什么標(biāo)準(zhǔn)差可以能很好反映數(shù)據(jù)的離散程度?上述計算表明當(dāng)數(shù)據(jù)離散程度越高,單項數(shù)據(jù)與平均值之差的平方也就越大,最終標(biāo)準(zhǔn)差也就越大,這點下表也有明確的反映。廣告點擊2014/1/12014/1/22014/1/32014/1/42014/1/52014/1/6A網(wǎng)站455565755070B網(wǎng)站30680402004A網(wǎng)站(Xi-μ)22252525225100100B網(wǎng)站(Xi-μ)29002916400400196003136表STYLEREF1\s1SEQ表\*ARABIC\s12AB網(wǎng)站單項數(shù)據(jù)與平均值之差的平方頻數(shù)頻數(shù)概念常用于分類變量,也可以對連續(xù)型變量進行分組后進行頻數(shù)統(tǒng)計,它是指落在各分類中的數(shù)據(jù)的個數(shù)。將各個類別及其相應(yīng)的頻數(shù)全部列出來就是頻率分布或稱次數(shù)分布,將頻數(shù)分布用表格的形式表現(xiàn)出來就是頻數(shù)分布表。例如,為了調(diào)查某網(wǎng)站訪問者的地域分布,獲取數(shù)據(jù)如下所示:地域人數(shù)比例百分比上海1120.5656.0四川510.25525.5新疆90.0454.5廣東160.0808.0福建100.0505.0西藏20.0101.0合計2001100表STYLEREF1\s1SEQ表\*ARABIC\s13某網(wǎng)站訪問者地域頻數(shù)分布表很顯然,如果不進行分類整理,觀察200個人分別分布在哪些地域就很不方便,通過分類整理后,就很容易地、直觀地判斷出哪個地方訪問該網(wǎng)站的人最多,哪個地方的人最少。如果是連續(xù)性數(shù)據(jù),可以用一定的分組方式,例如以下學(xué)生成績:(67,88,46,36,78,90),我們可以規(guī)定小于60為不及格,否則為及格,則分?jǐn)?shù)的頻數(shù)分布就是不及格:2;及格4。在REF_Ref413783601\h表13中,對頻數(shù)分布的描述還有比例和百分比兩個度量方式,這種統(tǒng)計分析中也是經(jīng)常用到的。比例是各類別中數(shù)據(jù)的數(shù)量占總體數(shù)據(jù)個數(shù)的比重,通常用于反映總體的構(gòu)成或結(jié)構(gòu)。如果總體數(shù)量被分成K個部分,每一部分的數(shù)量是N1、N2、……、Ni,則比例定義為Ni/N,顯然各部分比例之和等于1,即:百分比是一種標(biāo)準(zhǔn)化的比例,很多相對數(shù)都用百分比來表示,當(dāng)分子很小分母很大時,也可以采用千分比來表示比例。通常絕對數(shù)并不能用來進行比較,比例才是合適的比較方式。例如,A文章中有錯別字10個,B文章中有錯別字2個,我們能下結(jié)論說A文章的錯別字情況比B文章嚴(yán)重的多嗎?如果A文章總字?jǐn)?shù)是5萬個,而B文章只有20個字呢?累積頻數(shù)累積頻數(shù)經(jīng)常用于有序變量,計算方法就是按照順序?qū)⒏黝悇e的頻數(shù)逐級累加起來,有兩個方向:一是從類別順序的等級低的一方向等級高的一方進行累加,稱為向上累積;而是從等級高的一方向等級低的一方累積,稱為向下累積。通過累積頻數(shù),能夠很容易地看出某一等級之下或之上的頻數(shù)之和。例如某調(diào)查對網(wǎng)絡(luò)視頻廣告態(tài)度的人數(shù)統(tǒng)計如下:指標(biāo)非常不滿意不滿意一般滿意非常滿意頻數(shù)10050251510向上累積100150175190200向下累積200100502510百分比(%)50.025.0向上累積頻率50.075.087.595.0100向下累積頻率10050.025.012.55.0表STYLEREF1\s1SEQ表\*ARABIC\s14網(wǎng)絡(luò)視頻廣告態(tài)度調(diào)查累積頻數(shù)表8.累積頻率在REF_Ref413785825\h表14中還有累積頻率的度量方式,它可以用來對不同數(shù)據(jù)組的累積分布進行比較,其計算方法是按照等級順序計算各類別的百分比例,同樣有向上累積頻率和向下累積頻率兩種計算方向。R語言基礎(chǔ)R語言簡介為什么要使用R語言許多統(tǒng)計軟件價格不菲,而R語言完全是免費的,越來越多的企事業(yè)單位使用R語言。R是一個全面的統(tǒng)計研究平臺,提供各式各樣的數(shù)據(jù)分析技術(shù),幾乎任何類型的數(shù)據(jù)分析工作都可以在R中完成。R具有頂尖水準(zhǔn)的制圖功能,對于希望復(fù)雜數(shù)據(jù)能夠可視化的情境下,R語言特別適用。R語言任何一個分析步驟的結(jié)果均可以被輕松保存,并被作為進一步分析的輸入。R語言特別方便從多個種類的數(shù)據(jù)源獲得數(shù)據(jù),包括文本文件、數(shù)據(jù)庫、excel表、統(tǒng)計軟件以及專門的數(shù)據(jù)倉庫。它同樣可以把數(shù)據(jù)寫到這些系統(tǒng)中。R語言提供便捷快速的統(tǒng)計命令,相比其它統(tǒng)計軟件而言,一些常用的數(shù)據(jù)分析往往通過簡單的命令或代碼即可完成。R語言源源不斷產(chǎn)生各種包,提供強大的函數(shù)方便實現(xiàn)各種數(shù)據(jù)分析統(tǒng)計功能。R語言的獲取和安裝R可以在CRAN(網(wǎng)址:)上免費下載,下載時要注意選擇計算機的操作系統(tǒng)以及位數(shù)(也即你的計算機是基于32位的還是64位的)。R的使用在R語言中,大小寫是區(qū)分開的,這和很多其它語言不一樣,例如在R語言中經(jīng)常要有布爾值TRUE的應(yīng)用,將其寫為true就會發(fā)生報錯。所以在調(diào)用各種函數(shù)時,由于大小寫沒有注意分開而報錯是常見的現(xiàn)象。所以在R命令運行發(fā)生錯誤的時候,檢查有沒有大小寫的誤用(特別是將該大寫的字母用小寫表示了)。R語句主要由函數(shù)和賦值構(gòu)成,函數(shù)用來對數(shù)據(jù)進行處理,賦值往往是將處理的結(jié)果存儲到某一變量中。函數(shù)是R語言的核心,每個函數(shù)都有固定的函數(shù)名和系列參數(shù),實現(xiàn)特定的統(tǒng)計和分析功能(包括作圖)。R語言的賦值使用<-,而非=號(雖然R語言允許使用=來表示賦值,但這不是標(biāo)準(zhǔn)寫法,在本課程中,賦值只允許使用<-)。例如語句:>x<-c(1,2,2,3,5)即調(diào)用c函數(shù)(功能構(gòu)建一個向量),生成向量(1,2,2,3,5)并將其賦值給變量x。提醒:R語言的命令提示符是>,以后案例中的分析代碼或命令時,均以命令提示符>開頭,如果你要練習(xí)案例中的代碼,案例中的>是不能輸入的。R語言的注釋是由#開頭的,在#之后出現(xiàn)的任何文本都會被R解釋器所忽略。添加注釋是個好習(xí)慣,他有助于你回頭檢查R程序時指導(dǎo)某條命令或代碼是做什么用的,而沒有注釋幫助,你原先清晰的思路在回頭檢查時會消失地?zé)o影無蹤。RConsole安裝完R后,可以從開始菜單啟動R,也可以雙擊桌面的R圖標(biāo)啟動R,界面如REF_Ref411890810\h圖21所示:圖STYLEREF1\s2SEQ圖\*ARABIC\s11RConsole界面圖在RConsole中,命令提示符是紅色現(xiàn)實,在其后可以輸入R語句并回車運行。我們可以通過一個簡單的例子來了解一下R工作過程。部分嬰兒月齡和體重數(shù)據(jù)如REF_Ref411891294\h表21所示,體重的分布如何?及其與月齡是否存在什么關(guān)系?月齡體重(kg)月齡體重(kg)014.4097.3035.3036.0057.20910.4025.21210.2118.5036.1表STYLEREF1\s2SEQ表\*ARABIC\s1110名嬰兒月齡和體重R語言對該問題的處理代碼如下:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s11:>age<-c(1,3,5,2,11,9,3,9,12,3)#將10名嬰兒月齡賦值到向量age中>weight<-c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)#將10名嬰兒體重賦值到向量weight>mean(weight)#用mean函數(shù)求體重的平均值[1]7.06>ad(weight)#用sods函數(shù)求體重的標(biāo)準(zhǔn)差[1]2.077498>cor(age,weight)#用cor函數(shù)計算月齡和體重的相關(guān)系數(shù)[1]0.9075655>plot(age,weight)#用plot函數(shù)繪制月齡和體重的散點圖運行結(jié)果顯示,10名嬰兒的平均體重是7.06kg,標(biāo)準(zhǔn)差為2.08kg,二者有較強的線性相關(guān)關(guān)系,相關(guān)系數(shù)達(dá)到0.908。月齡和體重的散點圖如REF_Ref411891926\h圖22所示:圖STYLEREF1\s2SEQ圖\*ARABIC\s1210名嬰兒的月齡和體重散點圖從散點圖中可以看到,隨著嬰兒的月齡增加,其體重也有增加趨勢。RStudio一個更好的R編輯器是RStudio,可以方便地從網(wǎng)上下載和安裝,運行后界面如REF_Ref411892839\h圖23所示:圖STYLEREF1\s2SEQ圖\*ARABIC\s13RStudio界面RStudio提供了更為便捷的操作方式,可以方便地在命令編輯區(qū)域定位鼠標(biāo),以及提供一些圖形化操作。包R語言提供了大量稱之為包的用戶貢獻(xiàn)模塊供免費下載和安裝,它們提供了驚人的功能,包括地理數(shù)據(jù)分析、甚至是心理測驗分析的功能。用R分析數(shù)據(jù)免不了要多次使用這些包。安裝包安裝包的命令格式如下:>install.packages("包名稱")命令運行后,會彈出選擇鏡像地址的列表,選擇適合的地址(例如ChinaHefei),就可以安裝了。注:在RStudio中安裝包往往出現(xiàn)不能解析服務(wù)器的情況,筆者也未探明其原因,出現(xiàn)此情況的時候在RConsole中運行安裝包命令即可解決,RStudio中可以正常使用。載入包如果要用所安裝包中的函數(shù)來處理數(shù)據(jù),必須先載入包,載入包的命令是>library(包名)包使用中常出現(xiàn)的問題使用了錯誤的大小寫,導(dǎo)致命令中的包名和實際包名不一樣。忘記在安裝包時在報名兩端加上雙引號(英文)。載入包時在包名兩端又加上雙引號。還未載入包時就使用包中的函數(shù)或者數(shù)據(jù)集。使用R腳本執(zhí)行命令建立腳本打開Rstudio,在File菜單中選擇“NewFile”子菜單中的“RScript”命令。在腳本中執(zhí)行命令在腳本工作區(qū)輸入多條正確的R命令,將光標(biāo)定位在該命令中,單擊“Run”按鈕或者按下“Ctrl+R”組合鍵,就可以執(zhí)行該R命令。腳本中的命令可以進行修改,然后重新執(zhí)行。R腳本保存單擊“保存”按鈕或者按下“Ctrl+S”組合鍵,可以保存當(dāng)前R腳本。第一次保存時會要求選擇保存位置和R腳本的文件名。打開R腳本在File菜單中選擇“OpenFile”命令,在彈出的對話框中找到R腳本所存儲的位置,將其打開即可。界面清除命令按下“Ctrl+L”鍵盤,可以將R命令窗口的內(nèi)容全部清除。使用rm(對象名),可以將創(chuàng)建的對象刪除。例如對于已經(jīng)創(chuàng)建的向量a,rm(a)命令可以將向量a清除。創(chuàng)建數(shù)據(jù)集數(shù)據(jù)集的概念數(shù)據(jù)集通常是由數(shù)據(jù)構(gòu)成的矩形數(shù)組,其中行表示觀測或者一個記錄,列表示變量。REF_Ref411928224\h表22顯示了一個假想的數(shù)據(jù)集。文章號(ID)時間(time)閱讀量(read)評論量(access)10012012-12-11122732010022012-12-17255644710032013-02-04331859210042013-05-084978841表STYLEREF1\s2SEQ表\*ARABIC\s12一個假想的數(shù)據(jù)集在這個假想的數(shù)據(jù)集里,可以看到四個列表示四個變量,有時候數(shù)據(jù)集中的列稱之為字段或者屬性。每一行代表一個記錄,即一個具體對象通過觀測獲得得的幾個變量的具體的值。R語言數(shù)據(jù)集中的數(shù)據(jù),可以是數(shù)值型、字符型、邏輯型、日期型等。數(shù)據(jù)結(jié)構(gòu)向量向量是存儲數(shù)據(jù)的一組數(shù)組。例如數(shù)值型向量(12,4,56,6)存儲4個數(shù)據(jù),字符型向量("you","me","somebody")存儲了3個字符,注意字符兩端要用雙引號括起來。向量非常重要,是R語言中數(shù)據(jù)存儲和處理的基本單元。創(chuàng)建向量可以用函數(shù)c()來實現(xiàn)。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s12a<-c(1,2,3,4,5,6,7,8)#創(chuàng)建一個數(shù)值型向量并存儲在a中b<-c("one","two","three","four")#創(chuàng)建一個字符型向量并存儲在b中。單個向量中必須擁有同樣類型的數(shù)據(jù),例如c(1,4,"some")由于包含了數(shù)值型和字符型數(shù)據(jù),將不能得到正確結(jié)果。在命令提示符后輸入向量名,例如>a,并回車,就會看到向量a中所包含的數(shù)據(jù)。也可以通過在方括號中給定具體的位置,來訪問向量這一位置上的值。例如a[4]訪問向量a的第4個元素。也可以在方括號內(nèi)包含一個存儲多個位置值的向量,來訪問向量多個位置上的值,但這多個位置需要用c()函數(shù)構(gòu)建一個向量,例如a[c(1,5)]表示訪問向量的第1和第5個元素。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s13 >a<-c(2,5,6,8,0,7) >a[2] [1]5 >a[c(1,3,4)] [1]268創(chuàng)建向量時,也可以用冒號生成一個數(shù)據(jù)序列,例如c(2:5)就是生成一個從2到5的數(shù)值序列,等價于c(2,3,4,5)。我們也可以把向量和其它元素(類型要相同)或幾個向量放在c函數(shù)中,連接成一個新的向量。例如: a<-c(1,2,3,4) b<-c(5,6,7,8) x<-c(8,9,a) y<-c(b,9,10) a<-c(a,b)#將向量a和b連接起來成為一個新向量,并保存在a中??梢允褂胹ort(向量名稱)對向量進行正序排序,rev(向量名稱)將向量反向排序。矩陣矩陣是一個二維數(shù)組,也就是將若干元素放置在若干行和若干列中,每個元素?fù)碛邢嗤臄?shù)據(jù)類型,例如: C1C2C3C4R11234R25678就是一個2行3列的矩陣,其中R1和R2是行的名稱,C1~C4是列的名稱。可以通過matrix函數(shù)創(chuàng)建,函數(shù)格式為:matrixname<-matrix(vector,nrow=行數(shù),ncol=列數(shù),byrow=邏輯值(TRUE或者FALSE),dimnames=list(行名向量,列名向量))其中vector是一個向量,包含了矩陣中的元素。示例代碼如下:>mymatrix<-matrix(c(1:12),nrow=3,ncol=4,byrow=TRUE,dimnames=list(c("R1","R2",”R3”),c("C1","C2","C3","C4")))創(chuàng)建完后,可以輸入矩陣名mymatrix并回車來觀察創(chuàng)建結(jié)果。如果要訪問矩陣中的某個元素,其格式是:矩陣名[行號,列號]例如mymatrix[2,3]訪問的就是矩陣mymatrix第2行第3列的元素值。如果行號缺失,表示訪問指定列的所有數(shù)據(jù),例如mymatrix[,2]表示訪問第2列全部數(shù)據(jù);而如果列號缺失,表示訪問指定行的所有數(shù)據(jù),例如mymatrix[3,]表示訪問矩陣第三行的全部數(shù)據(jù)。如果需要訪問多行或多列數(shù)據(jù),那么多個行號或列號要用c函數(shù)組織為一個向量,例如mymatrix[c(1,3),]表示訪問矩陣的第1、3行的全部數(shù)據(jù)。數(shù)組數(shù)組array與矩陣類似,但是維度可以大于2,數(shù)組可以通過array函數(shù)創(chuàng)建,創(chuàng)建形式如下:myarrayname<-array(vector,dimensions,dimname=list("維度1名稱向量","維度2名稱向量",……,"維度n名稱向量"))其中其中vector是一個向量,包含了數(shù)組中的元素,dimensions要用向量表示數(shù)組各維度的值。例如REF_Ref411950516\h代碼清單24創(chuàng)建了一個4列2行的二維數(shù)組。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s14>dimr<-c("A1","A2")>dimc<-c("r1","r2","r3","r4")>z<-array(1:8,c(2,4),dimnames=list(dimr,dimc))數(shù)據(jù)框數(shù)據(jù)框創(chuàng)建與矩陣或數(shù)組不一樣,數(shù)據(jù)框各列可以是不同數(shù)據(jù)類型的向量,它是R語言中最常處理的數(shù)據(jù)結(jié)構(gòu)。例如表格:PatientID(病人編號)Age(年齡)Method(治療方法)Stats(療效)125藥物改進234精神一般330藥物改進427精神惡化就是一個典型的數(shù)據(jù)框。數(shù)據(jù)框的創(chuàng)建可以通過函數(shù)data.frame創(chuàng)建,具體格式是:>數(shù)據(jù)框名稱<-data.frame(向量1,向量2,……,向量n)其創(chuàng)建一般過程是將數(shù)據(jù)框各列的數(shù)值存儲于一個向量中,然后再用data.frame函數(shù)將其組織存儲到該數(shù)據(jù)框中,REF_Ref411951125\h代碼清單25描述了一個數(shù)據(jù)集創(chuàng)建的例子。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s15>patientID<-c(1,2,3,4)>age<-c(25,34,30,27)>method<-c("藥物","精神","藥物","精神")>stats<-c("改進","一般","改進","惡化")>patientdata<-data.frame(patientID,age,diabets,stats)>patientdatapatientIDagemethodstats1125藥物改進2234精神一般3330藥物改進4427精神惡化數(shù)據(jù)框的各列雖然可以是不同數(shù)據(jù)類型,但各列內(nèi)部的數(shù)據(jù)必須是類型同一的。數(shù)據(jù)框引用單個元素的引用數(shù)據(jù)框的數(shù)據(jù)可以引用,單個元素的引用格式是:數(shù)據(jù)框名稱[行號,列號]例如patientdata[2,4]表示的是數(shù)據(jù)庫第2行、第4列的值“一般”。引用若干行列引用若干行列的格式是:數(shù)據(jù)框名稱[行號向量,列號向量]代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s16>patientdata[c(1,2),c(2,3)]引用中,也可以用變量名替代列號向量里的列號。例如REF_Ref411951867\h代碼清單26的引用命令也可以改寫成patientdata[c(1,2),c("age","diabets")],效果是一樣的,不過注意,使用這種方式時命令中的變量名必須有雙引號括起來。如果在行號和列號前加上負(fù)號,表示選擇除了該行(列)的其它所有行(列)引用若干行在實際應(yīng)用中,經(jīng)常需要查看數(shù)據(jù)框的少量行來觀察它的變量。如果直接輸入數(shù)據(jù)框名稱來觀察的話,由于記錄過多,會占據(jù)整個R編輯器窗口從而為操作帶來不便。查詢少數(shù)行命令格式是:數(shù)據(jù)框名稱[行號向量,],(也即將逗號后的列向量省略)例如patientdata[c(2,3),]是用來查看數(shù)據(jù)框patientdata的第2行和第3行數(shù)據(jù),patientdata[1:3,]表示查看patientdata的1到3行數(shù)據(jù)。(1:3是用來生成一個由1到3的序列組成的向量)一個簡單的方法是,使用head(數(shù)據(jù)框名)就可以顯示該數(shù)據(jù)框的前五行數(shù)據(jù)。在觀察數(shù)據(jù)框的變量結(jié)構(gòu)時,這個函數(shù)命令會非常有用。引用若干列同理,將數(shù)據(jù)框行列引用命令中的行向量省略,就可以訪問數(shù)據(jù)框的若干列。具體命令格式是:數(shù)據(jù)框名稱[,列號向量]或者是數(shù)據(jù)框名稱[,列名向量],比如對于數(shù)據(jù)框patientdata,patientdata[,c(1,4)]和patientdata[,c("patientID","stats")]結(jié)果是一樣的。數(shù)據(jù)框變量名的引用(重點)R語言數(shù)據(jù)分析中,經(jīng)常要對數(shù)據(jù)框中的某個變量進行處理,例如要求解patientdata數(shù)據(jù)框中年齡的平均值,直接運行mean(age)命令是不能得出結(jié)果的,因為R語言不知道要求解的age是哪個變量(可能在多個數(shù)據(jù)框中都有age這個變量),因此必須指定引用的變量是屬于哪個數(shù)據(jù)框,具體引用方法是:數(shù)據(jù)框name$變量名。REF_Ref411952802\h代碼清單27才能正確求出patientdata中各年齡的均值。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s17>mean(patientdata$age)不過,如果對某個數(shù)據(jù)框中的變量多次處理,每個變量前都加上“數(shù)據(jù)框名$”這樣的前綴是很討厭的,大大增加的輸入工作量而且容易出錯。可以采用以下兩種方法來簡化。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s18>attach(patientdata)>mean(age)>max(age)>plot(age,stats)>dettach(patientdata)采用REF_Ref411953014\h代碼清單28的方式,數(shù)據(jù)框中的變量就不用再需要加上數(shù)據(jù)框名$這樣的前綴了,其中關(guān)鍵的步驟在于attach(數(shù)據(jù)框名)的綁定操作,這樣其后的變量名都默認(rèn)屬于attach所處理的數(shù)據(jù)框。不過在應(yīng)用完后,最好用dettach(數(shù)據(jù)框名)將其解除。不過這種方式也有容易出錯的時候,因為在一個R語言數(shù)據(jù)分析項目中,同一個變量名可能有很多個,如果在綁定操作之前就存在與所綁定數(shù)據(jù)框中相同名稱的變量,則數(shù)據(jù)框中同名變量將被屏蔽,因而得不到所需要的結(jié)果。例如:>a<-c(1,2,3,4)>mydata<-data.frame(a=c(10,20,30,40),b=c(20,40,60,80))>attach(mydata)下列對象被屏蔽了_by_.GlobalEnv:a下一種處理格式可以避免命名沖突問題:>with(patientdata,{ datamean<-mean(age) datamax<-max(age) plot(age,stats)})對于這種處理方式,大括號中所有的引用變量都是屬于with所聲明patientdata數(shù)據(jù)框的,如果命令只有一條,那么大括號可以省略。不過with括號內(nèi)的賦值只能在with括號內(nèi)有效,如果讓with括號內(nèi)賦值能在全局范圍有效,可以用“<<-”替代“<-”,如下例所示:>with(mtcars,{+mymean<-mean(mpg)+mymean+})[1]20.09062>mymeanError:object'mymean'notfound注:mtcars是R語言自帶的一個數(shù)據(jù)框,如果R命令需要換行,按住shift鍵回車即可。對于變量的應(yīng)用,大部分R語言書籍都推薦with方式,就個人來說,習(xí)慣使用attach還是with方法來簡化輸入,或是直接使用“數(shù)據(jù)框名$變量名”的格式,根據(jù)個人的偏愛可以自己選擇。但無論如何,變量名必須指定清楚屬于哪個數(shù)據(jù)框,上述三種方法都是為變量指定數(shù)據(jù)框的,在后面介紹的一些函數(shù)中包括參數(shù)也具有指定數(shù)據(jù)框的作用。因子在數(shù)據(jù)分析中,經(jīng)常存在類別的比較,存放類別信息的變量有名義型變量和有序型變量兩種。名義型變量是沒有順序之分的類別變量,也即純粹表示類別的變量,變量值的類別之間沒有等級之分,例如“男”和“女”,數(shù)據(jù)框patientdata中的“method”變量,其中的取值是"藥物","精神",也只是代表處理類型的區(qū)別,并不意味幾者之間存在順序或等級。而stats變量的取值有“改進”、“一般”、“惡化”,明顯存在等級或順序關(guān)系,因此stats變量屬于順序型變量。在R語言中,類別變量和順序變量都統(tǒng)稱之為因子。因子非常重要,因為在R語言中經(jīng)常需要根據(jù)因子類別來分組描述各種數(shù)據(jù)。如果在數(shù)據(jù)框中某個變量的取值是字符串而非數(shù)字,則默認(rèn)該變量為因子,即每個字符串代表一種類別。例如以下數(shù)據(jù)框(一些微信公眾號的推送信息):Name(公眾號名稱)Date(日期)Artinum(文章數(shù))中國家庭醫(yī)生2014/6/263中國家庭醫(yī)生2014/6/274中國家庭醫(yī)生2014/6/304健康管理2014/6/91健康管理2014/6/101健康管理2014/6/111健康管理2014/6/121健康管理2014/6/191健康管理2014/6/301表STYLEREF1\s2SEQ表\*ARABIC\s13一個示例數(shù)據(jù)框(articledata)公眾號名這個變量就是因子,因子包括中國家庭醫(yī)生和健康管理兩個類別。我們可以根據(jù)不同的因子取值來統(tǒng)計每一種類別的相關(guān)數(shù)據(jù),例如對于公眾號名因子來說,中國家庭醫(yī)生的文章總數(shù)是11,健康管理的文章總數(shù)是6。在數(shù)據(jù)框中,有些變量例如日期、年齡是以數(shù)字形式表示的,有些變量例如性別,也是以1和0表示(1代表男,0代表女),如果要根據(jù)日期、年齡或者性別來分類統(tǒng)計分析數(shù)據(jù),那么以數(shù)字來取值的變量是不被認(rèn)為為因子的,此時直接處理會發(fā)生錯誤,所以要將這些實際表示類別卻以數(shù)字取值的變量進行因子化,方法是對變量用因子函數(shù)factor處理。例如對日期進行因子化,則可以運行命令:articledata$date<-factor(articledata$date)對于有序型變量,需要為factor函數(shù)指定參數(shù)ordered=TRUE。給定向量:status<-c("poor","improved","excellent","poor")語句status<-factor(status,ordered=TRUE)會將status因子水平編碼為(3,2,1,3),并在內(nèi)部將其關(guān)聯(lián)為1=excellent,2=improved,3=poor,并自動選擇合適的辦法將其作為有序型變量處理了。對于字符型變量,默認(rèn)情況下,因子的水平是按照其字母順序創(chuàng)建的。在上例中,按照字母順序,excellent水平為1,improved水平為2,poor水平為3,這和三個因子的邏輯順序也是一致的,因此并沒有什么問題。但是如果poor編碼改為alling,那么按照字母順序,alling(表示很差)水平為1,exellect(優(yōu)異)水平為2,improved(改進)水平為3,這是問題來了,因子的水平與其語義在邏輯上并不一致了,這種情況是很難讓人滿意的。對此我們可以通過levels參數(shù)來人工指定各因子的排序:status<-factor(status,ordered=TRUE,levels=c("alling","improved","excellent"))levels參數(shù)選項的值為一個向量,在向量中元素的位置就是其對應(yīng)值的因子水平,因此alling因子水平被設(shè)置為1,improved因子水平被設(shè)置為2,excellent因子水平被設(shè)置為3,從而與邏輯順序一致。列表列表是R的數(shù)據(jù)結(jié)構(gòu)中最復(fù)雜的一種,在一些函數(shù)參數(shù)中有所引用。簡單說,列表就是一些對象的有序結(jié)合,這些對象可以是向量、矩陣、數(shù)據(jù)框、數(shù)組,甚至是列表本身??梢允褂胠ist()創(chuàng)建列表,格式為:列表name<-list(對象1,對象2,……)
數(shù)據(jù)的輸入或者導(dǎo)入在實際工作中,R語言需要處理的數(shù)據(jù)需要臨時輸入,也可能存儲在excel表、數(shù)據(jù)庫或其他統(tǒng)計軟件文件格式中(例如SPSS),那么我們要面臨的工作是如何從這些地方將數(shù)據(jù)導(dǎo)入R中來并進行處理。使用鍵盤輸入數(shù)據(jù)R語言中提供edit()函數(shù)調(diào)用一個允許手工輸入數(shù)據(jù)的文本編輯器,具體步驟如下:創(chuàng)建一個空的數(shù)據(jù)框(或者矩陣)針對這個空的數(shù)據(jù)框調(diào)用文本編輯器,輸入數(shù)據(jù),并將結(jié)果保存。具體過程如下代碼所示:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s19>mydata<-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))#創(chuàng)建一個空的數(shù)據(jù)框,包含三個變量age、gender、weight,類型分別是數(shù)值、字符和數(shù)值。>mydata<-edit(mydata)#調(diào)用文本編輯器,如REF_Ref412233233\h圖24所示圖STYLEREF1\s2SEQ圖\*ARABIC\s14可手工輸入數(shù)據(jù)的文本編輯器單擊文本編輯器第一行上的變量名,彈出變量編輯器面板,可以在其中修改數(shù)據(jù)框變量名和變量類型,如REF_Ref412233361\h圖25所示:圖STYLEREF1\s2SEQ圖\*ARABIC\s15變量編輯器使用edit()調(diào)用文本編輯器并手工輸入的時候,必須將其賦予一個數(shù)據(jù)框,如果只運行命令>eidt(mydata),則在關(guān)閉文本編輯器時所有輸入將丟失??梢圆捎昧硪环N便捷的函數(shù)fix(mydata),而不用賦值,其輸入結(jié)果直接保存到mydata。將excel文件另存為CSV文件導(dǎo)入數(shù)據(jù)很多數(shù)據(jù)是存儲在excel表格中,可以將其另存為文本格式csv文件。而R語言提供read.table()函數(shù)來從csv文件導(dǎo)入數(shù)據(jù),并將其保存在一個數(shù)據(jù)框中。函數(shù)的命令格式為:數(shù)據(jù)框名<-read.table("路徑/文件名",header=TRUE,sep=",")在導(dǎo)入csv文件的R命令中,數(shù)據(jù)框名是導(dǎo)入數(shù)據(jù)要存儲在的數(shù)據(jù)框,路徑是文本文件存放的位置,文件名是數(shù)據(jù)所在的文本文件,header=TRUE表示將文本文件的第一行作為數(shù)據(jù)框的字段變量,sep指定分割數(shù)據(jù)的符號,默認(rèn)是逗號,也可以指定為制表符、空格等。以下代碼從e盤data文件夾下導(dǎo)入myfile.csv文件,保存在mydata數(shù)據(jù)框中。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s110>mydata<-read.table("e:/data/myfile.csv",header=TRUE,sep=",")注意,運行該命令導(dǎo)入CSV文件要避免以下易犯的錯誤有read.table函數(shù)名中間的點號沒有寫路徑的分隔符合錯寫為\文本文件的擴展名忘記header=TRUE沒有區(qū)別大小寫,例如將TRUE寫成true。還有種方法,可以將excel表格中要導(dǎo)入數(shù)據(jù)的某單元格選中然后按下Ctrl+A快捷鍵全選(這樣為了快速復(fù)制),然后按下ctrl+c復(fù)制。在R語言編輯器中,輸入如下命令
>mydata<-read.table("clipboard",header=TRUE)就可以將excel中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)框mydata中。從數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)使用R訪問存儲在數(shù)據(jù)庫中的數(shù)據(jù)是處理大數(shù)據(jù)集的有效手段。在R中,通過RODBC包訪問數(shù)據(jù)庫的流行方式,這種方式允許任何擁有ODBC驅(qū)動的數(shù)據(jù)庫,也就是當(dāng)前市面上流行的所有數(shù)據(jù)庫。不過ODBC驅(qū)動需要自己安裝并進行配置。以MYSQL為例,配置過程是如下所示:(1)下載MYSQL的ODBC驅(qū)動并安裝;(2)雙擊打開“控制面板-->管理工具”中的“數(shù)據(jù)源ODBC”,如REF_Ref414470336\h圖26所示:圖STYLEREF1\s2SEQ圖\*ARABIC\s16ODBC數(shù)據(jù)源管理器(3)單擊REF_Ref414470336\h圖26“ODBC數(shù)據(jù)源管理器”面板中的“添加”按鈕,彈出“創(chuàng)建新數(shù)據(jù)源”面板,如REF_Ref414470635\h圖27所示圖STYLEREF1\s2SEQ圖\*ARABIC\s17創(chuàng)建新數(shù)據(jù)源面板(4)選擇REF_Ref414470635\h圖27“創(chuàng)建新數(shù)據(jù)源”中的“MySQLODBC5.3UnicodeDriver”,單擊“完成”按鈕,彈出REF_Ref414470825\h圖28所示“配置數(shù)據(jù)源”面板圖STYLEREF1\s2SEQ圖\*ARABIC\s18數(shù)據(jù)源配置面板(5)在REF_Ref414470825\h圖28“數(shù)據(jù)源配置”面板中輸入REF_Ref414471431\h圖29所示的參數(shù):圖STYLEREF1\s2SEQ圖\*ARABIC\s19參數(shù)設(shè)置DataSourceName:輸入數(shù)據(jù)源連接的名稱,在R中連接數(shù)據(jù)庫中要用到該名稱;Description:輸入對該數(shù)據(jù)源的簡單描述,可任意;TCP/IPServer:輸入數(shù)據(jù)庫服務(wù)器的IP地址,此處用本地數(shù)據(jù)庫,輸入localhost;user:輸入數(shù)據(jù)框賬號;Password:輸入數(shù)據(jù)庫連接密碼;DataBase:選擇所連接數(shù)據(jù)庫所要訪問的數(shù)據(jù)庫;此時可以單擊“Test”按鈕測試連接是否成功;(6)利用RODBC包中的函數(shù)訪問數(shù)據(jù)庫。RODBC主要函數(shù)在REF_Ref414471475\h表24中介紹了相關(guān)功能。函數(shù)功能odbcConnect(dsn,uid="",pwd="")建立一個到ODBC數(shù)據(jù)庫的連接,dsn是控制面板中驅(qū)動配置時所取得的數(shù)據(jù)源名稱,uid是數(shù)據(jù)庫訪問的賬號,pwd是訪問數(shù)據(jù)庫的密碼。該函數(shù)運行的結(jié)果應(yīng)該存儲在一個變量,例如channel中。sqlFetch(channel,"tablename")從channel存儲的數(shù)據(jù)庫連接中讀取一個表,并存儲到數(shù)據(jù)框中,tablename參數(shù)是具體的表名,兩端有雙引號括起來。sqlQuery(channel,query)在channel存儲的數(shù)據(jù)庫連接中運行一個query查詢命令(select語句),將查詢結(jié)果導(dǎo)入來存儲到一個數(shù)據(jù)框中。close(channel)關(guān)閉與數(shù)據(jù)源的連接表STYLEREF1\s2SEQ表\*ARABIC\s14RODBC包中主要函數(shù)例:將某個數(shù)據(jù)庫中的表kc導(dǎo)入到數(shù)據(jù)框mykc中。假設(shè)odbc驅(qū)動名稱為myconnect,數(shù)據(jù)庫訪問賬號是root,密碼是123456。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s113>library(RODBC)>myconn<-odbcConnect("myconnect",uid="root",pwd="123456")>mykc<-sqlFetch(myconn,"kc")#第一種方法導(dǎo)入kc表中數(shù)據(jù)>mykc1<-sqlQuery(myconn,"select*fromkc")#第二種方法導(dǎo)入crime表中數(shù)據(jù)>close(myconn)第二種方法提供了更為靈活地訪問數(shù)據(jù)庫的方式,它可以通過查詢語句將滿足一定條件以及所感興趣的字段導(dǎo)入到數(shù)據(jù)框中。例如:>mydata<-sqlQuery(myconn,"select姓名,成績fromxs_kcnaturaljoinxs")也就是將xs_kc和xs表進行自然連接,從兩個表中調(diào)取感興趣的數(shù)據(jù)(姓名和成績)。不過查看各個數(shù)據(jù)框時,中文并沒有正確顯示出來,我們看到是一堆亂碼,對于這種情況,需要進行如下處理單擊“Details”按鈕,如REF_Ref414473968\h圖210所示,單擊“Connection"選項卡,在“CharacterSet”(紅色線框內(nèi))選擇編碼方式為gb2312,這對R處理中正確顯示數(shù)據(jù)庫中的中文字符至關(guān)重要;圖STYLEREF1\s2SEQ圖\*ARABIC\s110在CharacterSet列表中選擇gb2312因為此時有原先的連接存在,因此先運行close(mycoonn)命令,然后重新運行一下myconn<-odbcConnect("myconnect",uid="root",pwd="123456")命令,這時運行調(diào)入數(shù)據(jù)庫數(shù)據(jù)到數(shù)據(jù)框的命令,中文顯示正常。如果運行select語句失敗,可以將原先連接關(guān)閉掉,重新建立一次連接有可能解決問題。處理數(shù)據(jù)對象的實用函數(shù)length函數(shù)功能:用來返回某個對象中元素或成分的個數(shù),例如:>length(mydata)[1]5表示mydata數(shù)據(jù)框有5個變量>length(mydata$date)[1]16表示數(shù)據(jù)框mydata的date變量有16個觀測值,即16條記錄值。使用length函數(shù)時有種特殊的情況,就是計算某個變量中取值的種類數(shù),例如>a<-c(1,2,3,3,4,4)我們可以明顯得看到向量中元素的個數(shù)是6個,但取值的種類數(shù)只有4個,分別是1、2、3、4。如何求出變量取值的種類數(shù)呢?我們需要對向量實施unique函數(shù),將向量中相同種類的取值唯一化,即:>unique(a)[1]1234此時再調(diào)用length函數(shù),就能正確求出取值的種類數(shù)。完成的命令格式是:length(uique(函數(shù)名))如上例:>length(unique(a))[1]4dim函數(shù)功能:顯示某個對象的維度。例如:>dim(mydata)[1]165表示mydata有兩個維度,且行維度為16個行,列維度是5個列。str函數(shù)功能:顯示某個對象的結(jié)構(gòu),例如:>str(mydata)'data.frame': 16obs.of5variables:$channel:Factorw/2levels"Mobile","PC":2222222211...$date:Factorw/8levels"2014/1/10","2014/1/16",..:1234567812...$beijing:num34224255443648335221...$shanghai:num42004683490949255262...$guangzhou:num5210560056775848NA...上述代碼就顯示了有多少觀測值,多少變量,每個變量的類型和部分取值。class函數(shù)功能:查詢某個對象的類型,例如:>class(mydata)[1]"data.frame"結(jié)果表示mydata是個數(shù)據(jù)框;>class(mydata$channel)[1]"factor"結(jié)果表示mydata中的變量channel類型是因子。head(object)功能:輸出對象object的開始部分,例如>head(mydata)#輸出mydata數(shù)據(jù)庫的開始幾行的數(shù)據(jù)值。rm(object)將工作環(huán)境中的對象object刪除。
數(shù)據(jù)基本處理將數(shù)據(jù)導(dǎo)入并以矩陣或者數(shù)據(jù)框結(jié)構(gòu)組織起來只是數(shù)據(jù)分析的第一步,我們可能要面臨大量的數(shù)據(jù)基本處理準(zhǔn)備工作,這一工作可能占到整個工作量60%以上,例如創(chuàng)建新變量、變量重編碼、數(shù)據(jù)篩選等工作。本節(jié)以一個假想的電商網(wǎng)站在北京、上海和廣州三地銷售額數(shù)據(jù)為例,介紹數(shù)據(jù)基本處理所涉及到的內(nèi)容和處理方法。該假想電商網(wǎng)站的銷售數(shù)據(jù)(部分)如所示:channeldatebeijingshanghaiguangzhouPC2014/1/10342242005210PC2014/2/26483349255848PC2014/3/752215262Mobile2014/2/26484958608319Mobile2014/3/749866135Mobile2014/6/22549169258724表STYLEREF1\s2SEQ表\*ARABIC\s15假想的電商網(wǎng)站銷售數(shù)據(jù)在上表的數(shù)據(jù)中,channel表示銷售渠道,有PC端和Mobile移動端兩種,date是銷售時間,beijing、shanghai、guangzhou分別是北京、上海和廣州的銷售額數(shù)據(jù)。原始數(shù)據(jù)存儲在計算機E盤data文件夾中的myfile.csv文件中,我們首先運行導(dǎo)入csv文件的R命令:mydata<-read.table("e:/data/myfile.csv",header=TRUE,sep=",")將數(shù)據(jù)導(dǎo)入到mydata數(shù)據(jù)框中。接下來以mydata數(shù)據(jù)框為例,實現(xiàn)各種數(shù)據(jù)的基本處理方法。變量的重命名如果對數(shù)據(jù)框中的變量名不滿意,可以通過交互式方式或者命令方式來進行修改。我們主要介紹交互方式的變量名修改,因為這是最為方便的修改方式。可以運行fix(mydata)命令彈出文本編輯器,單擊第一行的變量名,在變量編輯器中修改變量的名稱和類型即可。可參考上一節(jié)REF_Ref412233361\h圖25。創(chuàng)建新變量在一些數(shù)據(jù)處理項目中,可能需要創(chuàng)建新變量,例如在電商銷售表中,我們希望能知道電商網(wǎng)站三地銷售總額,并將其存放在一個新變量total中。創(chuàng)建新變量往往會涉及到一些基本算術(shù)運算,R語言中算術(shù)運算符及其含義如所示:運算符描述+加法-減法*乘法/除法^或**求冪2^2=4X%%Y求余,例如5%%2的結(jié)果為1X%/%Y整除,例如5%/%2的結(jié)果為2表STYLEREF1\s2SEQ表\*ARABIC\s16R語言算術(shù)運算符如果要進行字段的算術(shù)運算,那么excel的單元格設(shè)置數(shù)值格式時,一定不能使用千位分隔符,否則導(dǎo)入到R中時全部變成字符類型而非數(shù)值類型,運算處理就會出問題。對于創(chuàng)建total變量存放三地銷售總額的問題,如下代碼可以實現(xiàn):代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s114>mydata$total<-mydata$beijing+mydata$shanghai+mydata$guangzhou代碼中,創(chuàng)建的新變量和參與計算的原有變量都需要指定隸屬的數(shù)據(jù)框。對于初學(xué)者,在創(chuàng)建新變量是容易有以下錯誤:錯誤代碼1:>total<-beijing+shanghai+guangzhou,對于這個代碼,因為R不知道各變量屬于哪個數(shù)據(jù)框,因此運行報錯。錯誤代碼2:total<-mydata$beijing+mydata$shanghai+mydata$guangzhou,該代碼可以正常運行,求和結(jié)果也存放在total中,但是total是個獨立的變量,而不隸屬于mydata數(shù)據(jù)框。變量的重編碼對原始數(shù)據(jù)處理中,可能需要對原有變量進行重編碼,即用其它值類型來替代原有值,例如原始數(shù)據(jù)中以1和0表示男女性別,有人認(rèn)為不直觀需要將其直接用“男”“女”來表示,再例如你需要將連續(xù)的數(shù)據(jù)劃分到若干區(qū)間,諸如分?jǐn)?shù)小于60為不及格等等之類的問題。變量的重編碼需要用到判斷條件,判斷條件為真值(TRUE,即條件成立)則執(zhí)行相應(yīng)的重編碼命令,判斷條件一般形式是邏輯運算表達(dá)式,對應(yīng)的邏輯運算符在所示。運算符功能運算符功能<小于<=小于等于>大于>=大于等于==等于!=不等于!x非xx|yX或者yx&yx且yisTRUE(x)測試x是否為TRUE表STYLEREF1\s2SEQ表\*ARABIC\s17R語言邏輯運算符假設(shè)我們需要根據(jù)total值進行分類,即小于10000等級為low,10000和15000之間為comm,大于15000為high,并將相應(yīng)的等級存儲于新變量level之中,所用的命令格式為:數(shù)據(jù)框名$變量名[判斷條件]<-新值具體代碼如下:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s115>mydata$level<-NA>mydata$level[mydata$total<10000]<-"low">mydata$level[mydata$total>=10000&mydata$total<15000]<-"comm">mydata$level[mydata$total>=15000]<-"high"運行上述代碼后,mydata中將添加一個新變量,其值根據(jù)total值的范圍分別取為low、comm、high。這段代碼也可與寫成更為緊湊的形式:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s116>within(mydata,{ level[total<10000]<<-"low" level[total>=10000&total<15000]<<-"comm" level[total>=15000]<<-"high"})使用within函數(shù),各變量的前綴mydata$可與省略,即不必指定變量所屬的數(shù)據(jù)框,因為within已經(jīng)做了指定。缺失值在任何規(guī)模的數(shù)據(jù)分析項目中,總有可能遇到缺失值情況,即由于機器故障、問題未作答等原因?qū)е伦兞吭谀骋挥^測中沒有相應(yīng)的值,在R語言中,缺失值用NA表示。在分析中,含有缺失值的算術(shù)表達(dá)式或者函數(shù)其結(jié)果也將為NA,例如:>a<-c(2,3,NA,5)>sum(a)[1]NA上述代碼中,a被賦予一個包含缺失值的向量,對其用sum函數(shù)求和,結(jié)果也是NA,這并不是我們所希望的,好在很多函數(shù)中都提供na.rm=TRUE的選項,可以移除缺失值,用剩下的值進行運算,例如對于向量a,運行命令>sum(a,na.rm=TRUE)[1]10可以發(fā)現(xiàn)缺失值被移除了,并用剩下的值求和,得到正確的結(jié)果10。在用函數(shù)處理含有缺失值的數(shù)據(jù)時,務(wù)必查一下函數(shù)的幫助文檔(命令為help(函數(shù)名)),檢查該函數(shù)如何處理缺失值的。檢查是否有缺失值的函數(shù)的is.na()在一個數(shù)據(jù)集中,如果少量觀測含有缺失值而影響分析結(jié)果的話,可以通過函數(shù)na.omit()移除所有含有缺失值的觀測。例如na.omit(mydata)可以將mydata中所有包含缺失值的行刪除。不過如果數(shù)據(jù)集中有大量缺失值的情況下,na.omit()函數(shù)可能刪除大量數(shù)據(jù),此時要用更高級方法來進行處理。注意:從ecxel表中導(dǎo)入數(shù)據(jù)時,缺失的單元格在R中可能顯示為空白,但它并不是缺失值,缺失值一定顯示為NA。解決辦法是將excel全選,用NA全部替換空白。日期值日期或時間通常以字符串形式輸入R中,或者從外部導(dǎo)入到R中的日期也是字符串形式。如果要在后期數(shù)據(jù)處理中將其作為日期值處理,必須將其轉(zhuǎn)化為日期變量類型,這點非常重要,否則對日期的處理會發(fā)生錯誤。將字符串形式的日期或時間轉(zhuǎn)化為日期變量類型,可以使用as.Date()函數(shù),其語法為as.Date(x),其中x是字符型日期數(shù)據(jù)。例如mydata中原始日期數(shù)據(jù)格式是“2014-01-12”的形式,可以用以下命令來轉(zhuǎn)換為日期型變量:>mydata$date<-as.Date(mydata$date),轉(zhuǎn)化后的日期和轉(zhuǎn)換前格式是一樣的。如果希望改變?nèi)掌谛妥兞康母袷?,可以用format(x,"output_format")命令進行修改,其中x必須是日期型變量,output_format是日期呈現(xiàn)的格式(見REF_Ref412206479\h表28)。符號含義示例%d數(shù)字表示的日期(01~31)01~31%a縮寫的星期名Mon%A非縮寫的星期名Monday%m月份(01~12)01~12%b縮寫的月份Jan%B非縮寫的月份January%y兩位數(shù)的年份07%Y四位數(shù)的年份2007表STYLEREF1\s2SEQ表\*ARABIC\s18日期格式例如在執(zhí)行mydata$date<-as.Date(mydata$date)命令將date轉(zhuǎn)換為日期型變量后,再執(zhí)行命令:>mydata$date<-format(mydata$date,"%m/%d"),可以改變mydata中date變量的輸出格式,可運行命令觀察結(jié)果。Sys.Date()可以獲得當(dāng)前的日期,date()函數(shù)返回當(dāng)前的日期和時間。另外,日期可以直接做減法,得到兩個日期相鄰的天數(shù)。例如:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s117>day<-as.Date("2015-02-21")-as.Date("1980-01-01")>dayTimedifferenceof12835days說明從1980年1月1日到2015年2月21日已經(jīng)過了12835天。在數(shù)據(jù)處理過程中,有以下幾種情況可能經(jīng)常遇到,那么這些情況下該如何用R語言進行處理?轉(zhuǎn)換年、月、日為日期如果在原始數(shù)據(jù)中,年、月和日分別存儲在不同的變量中,也就是它們是分離的,例如如下數(shù)據(jù)存儲方式:年月日訪問量20103271800201142124000201181832100而我們在處理的時候需要將它們合并為規(guī)范的日期形式,解決的方案是先使用ISOdate函數(shù)將分離的年月日聯(lián)結(jié),然后對結(jié)果再調(diào)用as.Date函數(shù)轉(zhuǎn)換成日期數(shù)據(jù),其調(diào)用格式為:as.Date(ISOdate(year,month,day))。例如:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s118>year<-c(2012,2011,2011)>month<-c(2,4,8)>day<-c(27,21,18)>p<-as.Date(ISOdate(year,month,day))>p[1]"2012-02-27""2011-04-21""2011-08-18"不過,除非必要的情況下,并不建議將年月日分開來存儲時間信息,如果需要用到單個的年、月或者日的數(shù)據(jù),可以用下面的相關(guān)解決方案來處理。提取日期的一部分對于提取日期數(shù)據(jù)的某一個部分,可以使用as.POSIXlt函數(shù)后得到一個POSIXlt對象,引用對象中的具體部分即可。具體例子如下:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s119>p<-as.Date("2012-02-27")#創(chuàng)建一個日期型變量>p<-as.POSIXlt(p)#轉(zhuǎn)換POSIXlt對象>p$mday#調(diào)用日[1]27>p$mon#調(diào)用月[1]1>p$year#調(diào)用年[1]112不過這段代碼運行后,大家不知道有沒有看出什么問題?那就是調(diào)用的年和月與實際數(shù)據(jù)并不一致,這是因為POSIXlt對象里的月是從0開始計,也就是1月用0表示,2月用1表示,而年是當(dāng)前與1900年相隔多少年,因此,要得到具體的年和月,應(yīng)該對代碼調(diào)整,加上差值即可得到正確的數(shù)值:>p$mon+1;>p$year+1900。上例只是給出了POSIXlt對象的幾個引用,其完整的引用是:secminhourmdaymonyearwdayyday秒數(shù)分鐘數(shù)小時數(shù)日月份年份星期幾該年的第幾天0-590-590-231-310-111900起0-60-365該函數(shù)也可以對日期向量進行處理,結(jié)果得到包含多個年、月、日等分離數(shù)據(jù)的向量。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s120>mydate<c("2012-02-27","2011-04-21","2011-08-18")>p<-as.Date(mydate)>p<-as.POSIXlt(p)>p$mon+1[1]248>p$year+1900[1]201220112011數(shù)據(jù)類型轉(zhuǎn)換R中提供了一系列來用來判斷某個對象的類型和將其轉(zhuǎn)換為另一種類型的函數(shù),前文所述的as.Date()就是轉(zhuǎn)換為日期型數(shù)據(jù)的一個函數(shù),其它函數(shù)見REF_Ref412226834\h表29所示:判斷轉(zhuǎn)換is.numeric()判斷是否數(shù)值類型as.numeric()轉(zhuǎn)換為數(shù)值類型is.character()判斷是否字符類型as.character()轉(zhuǎn)換為字符類型is.vector()判斷是否向量as.vector()轉(zhuǎn)換為向量類型is.matrix()判斷是否矩陣as.matrix()轉(zhuǎn)換為矩陣類型is.data.frame()判斷是否數(shù)據(jù)框as.data.frame()轉(zhuǎn)換為數(shù)據(jù)框類型is.factor()判斷是否因子as.factor()轉(zhuǎn)換為因子is.logical()判斷是否邏輯值as.logical()轉(zhuǎn)換為邏輯類型表STYLEREF1\s2SEQ表\*ARABIC\s19類型判斷函數(shù)和類型轉(zhuǎn)換函數(shù)類型判斷函數(shù)返回值是TRUE或者FALSE,轉(zhuǎn)換函數(shù)將對象轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型。在編程時可以利用類型判斷函數(shù)判斷對象的類型并調(diào)用相應(yīng)的處理程序,而某些R函數(shù)要求處理特定類型的對象,這些情況下類型判斷函數(shù)和類型轉(zhuǎn)換函數(shù)將派上很大用場。數(shù)據(jù)排序在R中,可以利用order()函數(shù)對一個數(shù)據(jù)框進行排序,默認(rèn)的排序是升序,在排序依據(jù)變量前加上負(fù)號則轉(zhuǎn)換為降序排序。排序的命令是:數(shù)據(jù)框名<-數(shù)據(jù)框名[order(排序字段1,排序字段2),]以下例子表明了幾種R語言中對數(shù)據(jù)框進行排序的方法(有人喜歡在excel或者數(shù)據(jù)庫中先行進行排序,這也是一種方法選擇)。代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s1211.將mydata根據(jù)date變量升序排序,并保存在一個新數(shù)據(jù)框newdata中:>newdata<-mydata[order(mydata$date),]2.將mydata根據(jù)date排序,相同date值按照beijing變量值升序排序,并保存在一個新數(shù)據(jù)框newdata中:>attach(mydata)>newdata<-mydata[order(date,beijing),]>detach(mydata)3.將mydata根據(jù)date排序,相同date值按照beijing變量降序排列,并保存在一個新數(shù)據(jù)框newdata中:>attach(mydata)>newdata<-mydata[order(date,-beijing),]>detach(mydata)數(shù)據(jù)集的合并有時候,數(shù)據(jù)分散在不同的地方,在R中要對數(shù)據(jù)進行處理往往需要將這些分散的數(shù)據(jù)合并起來,合并有合并列和合并行的兩種方式:合并列合并列是橫向連接兩個數(shù)據(jù)框,使用的函數(shù)是merge()函數(shù),兩個數(shù)據(jù)框是根據(jù)一個或多個共同變量來連接,以保證連接后的每一行都是同一個觀測的數(shù)據(jù)。一個簡單的合并過程如下:數(shù)據(jù)集A數(shù)據(jù)集BIDNamegender1TOMF2JACKMIDCOURSESCORE1MATH991COMPUTER922ENGLISH80將二者進行合并的命令代碼是:>merge(A,B,by="ID") 合并結(jié)果為:IDNamegenderCOURSESCORE1TOMFMATH991TOMFCOMPUTER922JACKMENGLISH80從合并結(jié)果看,根據(jù)ID可以判斷A和B兩個數(shù)據(jù)框中哪些行是屬于同一個觀測對象的,并在合并結(jié)果中將屬于同一觀測對象的行組成新的行。因此要用merge()函數(shù)進行數(shù)據(jù)框合并,則參加合并的數(shù)據(jù)框必須具有公共變量,而且要指定公共變量(可能不止1個)為合并依據(jù),否則合并就不能成功或出現(xiàn)錯誤結(jié)果如果公共變量有多個,則函數(shù)命令變?yōu)椋簃erge(A,B,by=c(“公共變量1”,”公共變量2”,……))也可以不根據(jù)公共變量橫向合并兩個數(shù)據(jù)框,函數(shù)是cbind(A,B),但是A和B必須按照相同方式排序而且行數(shù)要相等,我們并不提倡使用這種方法,出現(xiàn)錯誤幾率較大。合并行合并行是縱向合并兩個數(shù)據(jù)框,使用的函數(shù)和命令格式是:rbind(A,B),使用這個函數(shù)的條件是兩個數(shù)據(jù)框必須具有同樣的變量。數(shù)據(jù)框A數(shù)據(jù)框BIdnamegender1TOMM2JACKMIdnamegender3KATEF4MARRIF5ANNAF運行命令:newAB<-rbind(A,B)結(jié)果為:Idnamegender1TOMM2JACKM3KATEF4MARRIF5ANNAF數(shù)據(jù)框選擇子集有時候我們需要選擇數(shù)據(jù)框的一個子集來進行處理,所謂子集是原數(shù)據(jù)框的一部分,子集的行滿足一定的條件,或者是原數(shù)據(jù)框中的某些列。R語言中提供subset()函數(shù)來進行子集選擇,命令格式是:subset(數(shù)據(jù)框名,選取行的條件,選取的列)選取行的條件一般是邏輯表達(dá)式,選取列的參數(shù)格式是select=c(變量1,變量2,……),如果subset()函數(shù)中缺失選取行的條件,則表示選擇所有的行;缺失選擇的列參數(shù),則表示選擇所有的變量;如果要在子集中刪除部分列,則參數(shù)格式是select=c(-變量名1,-變量名2……),也即在需要刪除的列名前加上減號。以下代碼是選取子集的一些例子:代碼清單STYLEREF1\s2SEQ代碼清單\*ARABIC\s122選擇guangzhou變量值大于5000且小于6000的行:>newdata<-subset(mydata,guangzhou>5000&guangzhou<6000)選擇channel、date變量:>newdata<-subset(mydata,select=c(channel,date))選擇除了channel和date變量的其它全部變量:>newdata<-subset(mydata,select=c(-channel,-date))選擇滿足guangzhou變量值大于5000且小于6000的行,且只有channel和date變量:>newdata<-subset(mydata,guangzhou>5000&guangzhou<6000,select=c(channel,date))再次提醒,如果要刪除所有包括空值的行,不能用subset函數(shù),而是要用na.omit()函數(shù)。
數(shù)值和字符處理函數(shù)基本數(shù)值處理函數(shù)REF_Ref414091420\h表210給出常用的數(shù)學(xué)函數(shù)函數(shù)功能示例abs(x)求絕對值abs(-10)返回值是10sqrt(x)求平方根sqrt(25)返回值是5ceiling(x)求不小于x的最小整數(shù)ceiling(3.475)返回值是4
ceiling(-3.475)返回值是-3floor(x)求不大于x的最大整數(shù)floor(3.475)返回值是3
floor(-3.475)返回值是-4trunc(x)截取整數(shù)部分trunc(5.89)返回值是5
trunc(-5.89)的返回值是-5round(x,digits=n)將x舍定為指定小數(shù)位的小數(shù)round(3.475,digits=2)的返回值的3.48signif(x,digits=n)將x舍定為指定有效數(shù)字位數(shù)signif(3,475,digits=2)的返回值是3.5log(x,base=n)求以n為底的x的對數(shù)log(81,3)返回值是4log(x)求自然對數(shù)log(10)返回值是2.3026log10(x)求以10為底的x的對數(shù)log10(1000)返回值是3exp(x)求x的自然指數(shù)值exp(2.3026)返回值是10表STYLEREF1\s2SEQ表\*ARABIC\s110常用數(shù)學(xué)函數(shù)及其功能字符處理函數(shù)nchar(x)nchar函數(shù)功能是獲取字符串x里的字符個數(shù),例如nchar("abcdedf")的返回值是7,nchar(c("ab","cde"))的返回值是c(2,3)。substr函數(shù)substr函數(shù)功能是提取或替換字符串向量中的子串,格式為substr(x,start,stop),其中x是要處理的字符串,start是替換子串的起始位置,stop是替換子串的結(jié)束位置。例如,substr("abcdefgxyz",3,6)的返回值是"cdef"。再例如:>x<-"abcdefgxyz"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 落實發(fā)文會簽制度
- 2026中冶堃元(重慶)金屬材料研究院有限公司招聘40人備考考試試題附答案解析
- 2026浙江溫州市平陽縣順溪鎮(zhèn)招聘編外人員1人參考考試試題附答案解析
- 第8章 拓展:管理主義的復(fù)歸與政策科學(xué)的興起
- 2026年度威海經(jīng)濟技術(shù)開發(fā)區(qū)鎮(zhèn)街所屬事業(yè)單位公開招聘初級綜合類崗位人員(15人)參考考試試題附答案解析
- 2026重慶飛駛特人力資源管理有限公司外派至中鐵建重慶石化銷售有限公司廚師崗招聘1人參考考試題庫附答案解析
- 2026陜西西安交通大學(xué)聚變科學(xué)與技術(shù)聯(lián)合研究院科研助理招聘1人備考考試試題附答案解析
- 2026麗水職業(yè)技術(shù)學(xué)院招聘專業(yè)技術(shù)人員19人(一)備考考試試題附答案解析
- 2026廣東深圳市何香凝美術(shù)館應(yīng)屆高校畢業(yè)生招聘1人備考考試試題附答案解析
- 2026中鐵西北科學(xué)研究院有限公司招聘隧道超前地質(zhì)預(yù)報巖土工程設(shè)計人員參考考試題庫附答案解析
- 2025年海管水平定向鉆穿越方案研究
- 全國網(wǎng)絡(luò)安全行業(yè)職業(yè)技能大賽(網(wǎng)絡(luò)安全管理員)考試題及答案
- 攝影家協(xié)會作品評選打分細(xì)則
- 電子產(chǎn)品三維建模設(shè)計細(xì)則
- 2025年中國道路交通毫米波雷達(dá)市場研究報告
- 設(shè)計交付:10kV及以下配網(wǎng)工程的標(biāo)準(zhǔn)與實踐
- 大學(xué)高數(shù)基礎(chǔ)講解課件
- hop安全培訓(xùn)課件
- 固井質(zhì)量監(jiān)督制度
- 中華人民共和國職業(yè)分類大典是(專業(yè)職業(yè)分類明細(xì))
- 2025年中考英語復(fù)習(xí)必背1600課標(biāo)詞匯(30天記背)
評論
0/150
提交評論