r语言各形状编号_R语言入门第八讲:编码分类变量(factor)
今天第八篇~~~~~~
在第一講中我給大家介紹了read.table函數(shù)的使用。最近我在處理一個一百萬左右的數(shù)據(jù),發(fā)現(xiàn)read.table函數(shù)出了問題。我不知道是在excel轉(zhuǎn)成txt時出的問題還是因為R在讀取數(shù)據(jù)時出了問題------應(yīng)該不是操作的問題,可能因為數(shù)據(jù)過于龐大(至少在參考書中目前應(yīng)該沒有一百萬的例子介紹),在轉(zhuǎn)換的過程中我讀不出來數(shù)據(jù)。它會提示我某某行數(shù)據(jù)不全。即使是我用了參數(shù)fill=T,也不管用,因為它會提示我行名稱重復(fù)。我并不知道為什么會這樣------我確信我的數(shù)據(jù)在excel表中是完整的,可是就是讀不出來。(當然還有一種可能就是我的計算機不夠高級,所以在轉(zhuǎn)換的時候出錯了------因為在運行的時候還是會卡,退出R都會等半天------師兄們說是我的電腦不行了)另外一個數(shù)據(jù)大概18萬個樣本量,也出現(xiàn)類似錯誤,或者少讀取那么一兩行,或者讀取的非常混亂。于是我在想,實踐就是和理論一樣啊!還是要多實踐才能進步。
好了,前面做了這么多鋪墊,目的就是想告訴大家read.table在讀取excel表格轉(zhuǎn)化的制表分隔符文件時出錯了。介紹一個更好用而且至少目前我成功讀出數(shù)據(jù)的函數(shù)read.csv。
它的使用和read.table一模一樣,參數(shù)也一模一樣。不同的一點就是參數(shù)的默認值。read.table中你需要設(shè)置header=T來確定變量名,設(shè)置fill=T來使行有空缺的數(shù)據(jù)讀入R中,但是在read.csv中,自動設(shè)置了這些項目,以及sep=”,”,因為excel本來就是逗號分隔。在讀取之前,你需要做的就是先把excel表格轉(zhuǎn)化為csv的格式:在另存為的文件類型中找到CSV(逗號分隔)(*.csv)這一選項保存就可以了。之后寫代碼就OK:
> setwd("E:/Rstore/")
> wq=read.csv("wq.csv")
> wq
A ?B ?C ?D
1 12 65 78 98
2 56 89 87 78
3 78 87 56 98
4 98 89 24 56
5 78 87 87 12
6 96 89 33 45
7 23 78 69 65
8 23 98 82 86
9 65 87 12 45
可以看到,什么都沒有設(shè)置,wq文件就被讀出來了,很方便。read.table的所有參數(shù)都可以在這里使用。
上一講我給大家介紹了參數(shù)stringsAsFactors。留了一個小小的疑問,就是什么是“factor”。在R中,它表示因子。說成因子可能大家不是很明白。實際上我自己也并不名明白。但是重要的仍然是運用。因子在R中起到的是分類變量的作用。這里稍微介紹幾個名詞。我們在統(tǒng)計分析中,通常都是選整體的一小部分觀察單位作為數(shù)據(jù)進行分析,而不是那個“整體”。這個整體我們稱為總體,而選擇的其中某些用來分析的這一小部分觀察單位稱作樣本。樣本包含的數(shù)量大小稱作樣本含量。 每個樣本的某個屬性特征是不相同的,這種不同被稱作變異,正因為有了變異的存在,所以我們將觀察單位的某種反映變異的特征稱為變量。舉個例子:某個省的全體男性是一個總體,那么我們選擇該省一部分男性做調(diào)查,這一部分男性就是樣本。選擇的這一部分男性的數(shù)量就是樣本含量。我們想了解這些男性的平均身高和體重,那么身高和體重就是變量,其測量值的大小稱為變量值。
變量的分類有很多種方法,這里面我只說其中的一種就足夠了:定量變量與定性變量。定量變量簡單說來就是可以用實數(shù)表示的變量,比如我們說的身高,體重,能夠確切的說出一個實數(shù)來代表它------如某個男性的身高為183cm,體重為70kg,是很明確的。定性變量又被稱作分類變量,即對該變量只能下一個定義,但是一般不能用確切的數(shù)值表示,比如性別(男,女),民族(回,漢),吸煙(是,否)。當然,我們在實際處理數(shù)據(jù)的時候會把它們變成某個數(shù)值(如1,2),但是這僅僅是為了適應(yīng)統(tǒng)計軟件,實際上它們還是分類變量。介于定量變量與定性變量之間的是等級變量(有序變量),所以也可以稱為半定量變量,比如高血壓,有1級,2級,3級,這些本質(zhì)上是分類變量,但是它們有先后順序(等級)差別,所以處理的時候就是另外的方法。
好了,下面我們介紹函數(shù)factor:
> ID=1:5
> sex=c(1,2,2,1,1)
> age=c(12,50,30,44,62)
> disease=c("malaria","hypertension","diabetes","hypertension","diabetes")
> degree=c("mild","severe","moderate","severe","moderate")
> patient=data.frame(ID,sex,age,disease,degree)
> patient
ID sex age ?????disease ??degree
1 ?1 ??1 ?12 ?????malaria ????mild
2 ?2 ??2 ?50 hypertension ??severe
3 ?3 ??2 ?30 ????diabetes moderate
4 ?4 ??1 ?44 hypertension ??severe
5 ?5 ??1 ?62 ????diabetes moderate
我隨意編寫了幾個數(shù)據(jù),第一行代碼生成了5位病人的ID,第二行是性別(1為男、2為女),第三行年齡,第四行為疾病(瘧疾、高血壓、糖尿病),第四行生成疾病的嚴重程度(輕度、重度、中等)。
在這里,年齡是一個定量變量,ID是編號,實際上并沒有什么分析意義。剩下的性別、疾病以及疾病的程度都屬于分類變量,在R中它們被稱作因子。雖然我們是以字符輸入的,但是默認的stringsAsFactors函數(shù)會幫我們進行轉(zhuǎn)化。要想了解該數(shù)據(jù)框的變量都是什么類型的,我們需要一個函數(shù)str():
> str(patient)
'data.frame': ??5 obs. of ?5 variables:
$ ID ????: int ?1 2 3 4 5
$ sex ???: num ?1 2 2 1 1
$ age ???: num ?12 50 30 44 62
$ disease: Factor w/ 3 levels "diabetes","hypertension",..: 3 2 1 2 1
$ degree : Factor w/ 3 levels "mild","moderate",..: 1 3 2 3 2
結(jié)果的第一行告訴我們該對象是一個數(shù)據(jù)框,有5個變量,其后用$連結(jié)的就是每一個變量的類型。結(jié)果的最后兩行disease和degree即被判定為因子,也就是分類變量,disease有三個水平,degree有三個水平。因子水平可以理解為分類變量的水平,或者說分類變量的類別。這里面性別給的是數(shù)值型變量,因為在錄入的時候我們指定1是“男”,2是“女”,這是為了在錄入數(shù)據(jù)時候方便而設(shè)置的。我們?nèi)绻雽⑺匦沦x值變?yōu)橐蜃?#xff0c;就需要使用factor函數(shù):
> patient$sex2=factor( patient$sex,levels=c(1,2),labels=c("M","F"))
> patient
ID sex age ?????disease ??degree sex2
1 ?1 ??1 ?12 ?????malaria ????mild ???M
2 ?2 ??2 ?50 hypertension ??severe ???F
3 ?3 ??2 ?30 ????diabetes moderate ???F
4 ?4 ??1 ?44 hypertension ??severe ???M
5 ?5 ??1 ?62 ????diabetes moderate ???M
這行代碼中,等號左邊是對數(shù)據(jù)框patient添加一新的子集“Sex2”,上一講已經(jīng)說明了,等號后面是factor的使用,即將一個向量變換為一個因子。我們將sex轉(zhuǎn)變?yōu)橐蜃?#xff0c;參數(shù)levels設(shè)定因子的水平,參數(shù)labels設(shè)定因子水平的標簽為“M”(male)和“F”(female)。
接下來我們再看看這個數(shù)據(jù)框的結(jié)構(gòu):
> str(patient)
'data.frame': ??5 obs. of ?6 variables:
$ ID ????: int ?1 2 3 4 5
$ sex ???: num ?1 2 2 1 1
$ age ???: num ?12 50 30 44 62
$ disease: Factor w/ 3 levels "diabetes","hypertension",..: 3 2 1 2 1
$ degree : Factor w/ 3 levels "mild","moderate",..: 1 3 2 3 2
$ sex2 ??: Factor w/ 2 levels "M","F": 1 2 2 1 1
結(jié)果的最后一行告訴我們因子sex2有兩個水平,分別是M和F。
分類變量有等級(順序)差別時,我們稱作等級變量(有序變量)。比如對疾病嚴重程度的分級:
> degree=c("mild","severe","moderate","severe","moderate")
> factor(degree)
[1] mild ????severe ??moderate severe ??moderate
Levels: mild moderate severe
這里顯示疾病程度有三個水平,輕度(mild)、中度(moderate)、和重度(severe),既然知道這是一個有等級差別的因子,我們在分析過程中肯定也要將它分等級,這時候我們會用到一個參數(shù)ordered=T,即排序:
> degree=c("mild","severe","moderate","severe","moderate")
> factor(degree,ordered=T)
[1] mild ????severe ??moderate severe ??moderate
Levels: mild < moderate < severe
結(jié)果中看到levels這一行有變化,R對嚴重程度進行排序并告訴我們輕度
> degree=c("slight","ailing","moderate","ailing","moderate")
> factor(degree,ordered=T)
[1] slight ??ailing ??moderate ailing ??moderate
Levels: ailing < moderate < slight
這種排序完全與我們的想法背離:重度(ailing)
> factor(degree,ordered=T,levels=c("slight","moderate","ailing"))
[1] slight ??ailing ??moderate ailing ??moderate
Levels: slight < moderate < ailing
這樣就和我們認為的相同了。
函數(shù)factor有一個默認參數(shù)exclude=NA,即排除含有NA的元素,意思就是缺失值NA不算作一個因子的水平。例如:
> degree=c("slight","ailing","moderate","ailing","moderate",NA)
> factor(degree)
[1] slight ??ailing ??moderate ailing ??moderate
Levels: ailing moderate slight
結(jié)果中NA沒有被算作一個水平。
> degree=c("slight","ailing","moderate","ailing","moderate",NA)
> factor(degree,exclude=NULL)
[1] slight ??ailing ??moderate ailing ??moderate
Levels: ailing moderate slight
令參數(shù)exclude等于空值(NULL)的話,則NA也被算作因子的一個水平。
當然,如果你想排除任意一個水平,只需把exclude的賦值更改即可:
> degree=c("slight","ailing","moderate","ailing","moderate")
> factor(degree,exclude="slight")
[1] ????ailing ??moderate ailing ??moderate
Levels: ailing moderate
這行代碼是將slight排除掉。原先的元素slight換成了缺失值,同時因子的水平也不存在slight。
str()函數(shù)可以窺探任何數(shù)據(jù)的結(jié)構(gòu),用法也很簡單。雖然里面還有很多參數(shù),但是應(yīng)該不妨礙我們直接對它的使用。我也在繼續(xù)研究該函數(shù),如果有結(jié)果會和大家分享。
factor()函數(shù)目前本人僅了解到該水平,并且我認為還是夠用的。
對于任何函數(shù),用法都是多樣的,如果有新的發(fā)現(xiàn)我會即時分享給大家。
最后,關(guān)于read.table函數(shù)在讀取大數(shù)據(jù)時候為什么會出現(xiàn)失誤,如果大家知道原因,或者有更好的辦法,可以和我討論。
本次就到這里~~~~
(圖片來源于網(wǎng)絡(luò))
總結(jié)
以上是生活随笔為你收集整理的r语言各形状编号_R语言入门第八讲:编码分类变量(factor)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扭矩大好还是马力大好_发动机的马力重要还
- 下一篇: python延迟5s_Python做扫描