日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R语言基础入门(9)之因子类型

發布時間:2025/3/15 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 R语言基础入门(9)之因子类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1.因子

2.table() 函數

3.tapply() 函數

4.forcats 包的因子函數

練習


1.因子

????????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 的不同值來求得??梢杂?strong>選項 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)))

就是先轉換為字符型,再進行合并就可以了。

2.table() 函數

????????用 table() 函數統計因子各水平的出現次數(稱為頻數或頻率)。也可以對一般的向量統計每個不同元素的出現次數。如 x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) table(sex)

返回:

對一個變量用 table 函數計數的結果是一個特殊的有元素名的向量,元素名是自變量的不同取值,結果的元素值是對應的頻數。單個因子或單個向量的頻數結果可以用向量的下標訪問方法取出單個頻數或若干個頻數的子集。

3.tapply() 函數

????????可以按照因子分組然后每組計算另一變量的概括統計。如

x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) h <- c(165, 170, 168, 172, 159) tapply(h, sex, mean)

返回:

4.forcats 包的因子函數

如果使用此函數,需要先進行載入:

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语言基础入门(9)之因子类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。