<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
R 中用因子代表資料中分類變數 , 如性別、省份、職業。有序因子代表有序量度,如打分結果,疾病嚴重程度等。
用 factor() 函數把字元型向量轉換成因子,如
x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) sex
返回:
attributes(sex)
返回:
因子有 class 屬性,取值為"factor",還有一個 levels(水平值) 屬性,此屬性可以用 levels() 函數存取,如
levels(sex)
返回:
因子的 levels 屬性可以看成是一個對映,把整數值 1,2, . . . 對映成這些水平值,因子在儲存時會儲存成整數值 1,2, . . . 等與水平值對應的編號。這樣可以節省儲存空間,在建模計算的程式中也比較有利於進行數學運算。
事實上,read.csv() 函數的預設操作會把輸入檔案的字元型列自動轉換成因子,這對於性別、職業、地名這樣的列是合適的,但是對於姓名、日期、詳細地址這樣的列則不合適。所以,在 read.csv() 呼叫中經常加選項 stringsAsFactors=FALSE 選項禁止這樣的自動轉換,還可以用 colClasses 選項逐個指定每列的型別。
用 as.numeric() 可以把因子轉換為純粹的整數值,如
as.numeric(sex)
返回:
因為因子實際儲存為整數值,所以對因子進行一些字元型操作可能導致錯誤。用 as.character() 可以把因子轉換成原來的字元型,如
as.character(sex)
返回:
為了對因子執行字元型操作(如取子串),保險的做法是先用 as.character() 函數強制轉換為字元型。
factor() 函數的一般形式為
factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE)
可以用選項 levels 自行指定各水平值 , 不指定時由 x 的不同值來求得。可以用選項 labels 指定各水平的標籤 , 不指定時用各水平值的對應字串。可以用 exclude 選項指定要轉換為缺失值 (NA) 的元素值集合。如果指定了 levels, 則當自變數 x 的某個元素等於第 j 個水平值時輸出的因子對應元素值取整數 j, 如果該 元素值沒有出現在 levels 中則輸出的因子對應元素值取NA。 ordered 取真值時表示因子水平是有次序的 (按編碼次序)。
在使用 factor() 函數定義因子時,如果知道自變數元素的所有可能取值,應儘可能使用 levels= 引數指定這些不同可能取值,這樣,即使某個取值沒有出現,此變數代表的含義和頻數資訊也是完整的。自己指定 levels= 的另一好處是可以按正確的次序顯示因子的分類統計值。
因為一個因子的 levels 屬性是該因子獨有的,所以合併兩個因子有可能造成錯誤,但在最新版本4.1.2 沒有報錯,應跟版本有關,如
li1 <- factor(c(' 男', ' 女')) li2 <- factor(c(' 男', ' 男')) c(li1, li2)
返回:
如果結果不是因子的話,需要對其進行轉換。則那樣正確的做法是
factor(c(as.character(li1), as.character(li2)))
就是先轉換為字元型,再進行合併就可以了。
用 table() 函數統計因子各水平的出現次數(稱為頻數或頻率)。也可以對一般的向量統計每個不同元素的出現次數。如
x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) table(sex)
返回:
對一個變數用 table 函數計數的結果是一個特殊的有元素名的向量,元素名是自變數的不同取值,結果的元素值是對應的頻數。單個因子或單個向量的頻數結果可以用向量的下標存取方法取出單個頻數或若干個頻數的子集。
可以按照因子分組然後每組計算另一變數的概括統計。如
x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) h <- c(165, 170, 168, 172, 159) tapply(h, sex, mean)
返回:
如果使用此函數,需要先進行載入:
library(forcats)
在分類變數類數較多時,往往需要對因子水平另外排序、合併等,forcats 包提 供了一些針對因子的方便函數。
orcats::fac_reorder() 可以根據不同因子水平分成的組中另一數值型變 量的統計量值排序。如:
set.seed(1) fac <- sample(c("red", "green", "blue"), 30, replace=TRUE) fac <- factor(fac, levels=c("red", "green", "blue")) x <- round(100*(10+rt(30,2))) res1 <- tapply(x, fac, sd); res1
返回:
對上面數值畫條形圖:
barplot(res1)
返回:
如果希望按照統計量次序對因子排序,可以用 forcats::fct_reorder() 函數,並畫圖條形圖,如
fac2 <- fct_reorder(fac, x, sd) res2 <- tapply(x, fac2, sd) barplot(res2)
返回:
新的因子 fac2 的因子水平次序已經按照變數 x 的標準差從小到大排列。
有時在因子水平數較多時僅想將特定的一個或幾個水平次序放到因子水平最前面,可以用 forcats::fct_relevel() 函數,如:
levels(fac)
返回:
fac3 <- fct_relevel(fac, "blue"); levels(fac3)
返回:
fct_relevel() 第一個引數是要修改次序的因子,後續可以有多個字元型參數列示要提前的水平。
forcats::fct_reorder2(f, x, y) 也調整因子 f 的水平的次序,但是根據與每組中最大的 x 值相對應的 y 值大小調整次序,這樣在作多個因子水平對應的曲線圖時可以比較容易地區分多條曲線。
forcats::fct_recode() 可以修改每個水平的名稱,如:
fac4 <- fct_recode( fac, " 紅"="red", " 綠"="green", " 藍"="blue") table(fac4)
返回:
fct_recode() 在修改水平名時允許多箇舊水平對應到一個新水平,從而合併原來的水平。如果合併很多,可以用 fct_collapse() 函數,記得要先匯入forcats 包的因子函數,如
compf <- fct_collapse( comp, " 其它"=c("", " 無名", " 無應答"), " 聯想"=c(" 聯想", " 聯想集團"), " 百度"=c(" 百度", " 百度集團") )
如果某個因子頻數少的水平很多,在統計時有過多水平不易展示主要的類別,可以用 forcats::fct_lump(f) 合併,預設地從最少的類合併一直到 “ 其它 ” 類超過其它最小的類之前,可以用 n= 引數指定要保留多少個類。
練習
設檔案 class.csv 中包含如下內容 :
name,sex,age,height,weight
Alice,F,13,56.5,84
Becka,F,13,65.3,98
Gail,F,14,64.3,90
Karen,F,12,56.3,77
Kathy,F,12,59.8,84.5
Mary,F,15,66.5,112
Sandy,F,11,51.3,50.5
Sharon,F,15,62.5,112.5
Tammy,F,14,62.8,102.5
Alfred,M,14,69,112.5
Duke,M,14,63.5,102.5
Guido,M,15,67,133
James,M,12,57.3,83
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Philip,M,16,72,150
Robert,M,12,64.8,128
Thomas,M,11,57.5,85
William,M,15,66.5,112
用如下程式把該檔案讀入為 R 資料框 d.class, 其中的 sex 列已經自動轉換為因
子。取出其中的 sex 和 age 列到變數 sex 和 age 中
d.class <- read.csv('class.csv', header=TRUE) sex <- d.class[,'sex'] age <- d.class[,'age']
(1) 統計並顯示列出 sex 的不同值頻數;
(2) 分男女兩組分別求年齡最大值;
(3) 把 sex 變數轉換為一個新的因子, F 顯示成 “Female” , M 顯示成 “Male” 。
到此這篇關於R語言因子型別的實現的文章就介紹到這了,更多相關R語言因子型別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45