R語(yǔ)言教程:數(shù)據(jù)結(jié)構(gòu)+導(dǎo)入數(shù)據(jù)!
with(mtcars, { nokeepstats <- summary(mpg) keepstats <<- summary(mpg)})nokeepstats 錯(cuò)誤: 找不到對(duì)象'nokeepstats'keepstats Min. 1st Qu. Median Mean 3rd Qu. Max. 10.40 15.43 19.20 20.09 22.80 33.90實(shí)例標(biāo)識(shí)符
病人編號(hào)(patientID)用于區(qū)分病例數(shù)據(jù)集中不同的個(gè)體。
實(shí)例標(biāo)識(shí)符(case identifier)可通過(guò)數(shù)據(jù)框操作函數(shù)中的rowname選項(xiàng)指定。
patientdata<-data.frame(patientID, age, diabetes, status, row.names=patientID)
將patientID指定為R中標(biāo)記各類(lèi)打印輸出和圖形中實(shí)例名稱(chēng)所用的變量。
6. 因子
變量可歸結(jié)為名義型、有序型或連續(xù)型變量。
名義型變量是沒(méi)有順序之分的類(lèi)別變量
有序型變量表示一種順序關(guān)系,而非數(shù)量關(guān)系
連續(xù)型變量可以呈現(xiàn)為某個(gè)范圍內(nèi)的任意值,并同時(shí)表示了順序和數(shù)量
類(lèi)別(名義型)變量和有序類(lèi)別(有序型)變量在R中稱(chēng)為因子(factor)。
函數(shù)factor()以一個(gè)整數(shù)向量的形式存儲(chǔ)類(lèi)別值,同時(shí)一個(gè)由字符串(原始值)組成的內(nèi)部向量將映射到這些整數(shù)上。
類(lèi)別(名義型)變量diabetes <- c("Type1", "Type2", "Type1", "Type1")diabetes <- factor(diabetes)
將此向量存儲(chǔ)為(1, 2, 1, 1),并在內(nèi)部將其關(guān)聯(lián)為1=Type1和2=Type2(具體賦值根據(jù)字母順序而定)。向量diabetes仍是名義型變量,不是有序型變量。
有序型變量
需要為函數(shù)factor()指定參數(shù)ordered=TRUE。
status <- c("Poor", "Improved", "Excellent", "Poor")status <- factor(status, ordered=TRUE)
將向量編碼為(3, 2, 1, 3),并在內(nèi)部將這些值關(guān)聯(lián)為1=Excellent、2=Improved以及3=Poor。
對(duì)于字符型向量,因子的水平默認(rèn)依字母順序創(chuàng)建。
如果水平的順序和字母的順序不一致,則需要用指定levels選項(xiàng)來(lái)覆蓋默認(rèn)排序。
status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent"))
各水平的賦值將為1=Poor、2=Improved、3=Excellent,任何在數(shù)據(jù)中出現(xiàn)而未在參數(shù)中列舉的數(shù)據(jù)都將被設(shè)為缺失值。
數(shù)值型變量
可以用levels和labels參數(shù)來(lái)編碼成因子。
例:如果男性被編碼成1,女性被編碼成2
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))
將變量轉(zhuǎn)換成一個(gè)無(wú)序因子,性別將被當(dāng)成類(lèi)別型變量,標(biāo)簽“Male”和“Female”將替代1和2在結(jié)果中輸出。
因子的使用:
#以向量形式輸入數(shù)據(jù)patientID <- c(1, 2, 3, 4)age <- c(25, 34, 28, 52)diabetes <- c("Type1", "Type2", "Type1", "Type1")status <- c("Poor", "Improved", "Excellent", "Poor")#指定為一個(gè)普通因子diabetes <- factor(diabetes) #指定為一個(gè)有序型因子status <- factor(status, order=TRUE) patientdata <- data.frame(patientID, age, diabetes, status
#顯示對(duì)象的結(jié)構(gòu)str(patientdata)'data.frame': 4 obs. of 4 variables: $ patientID: num 1 2 3 4 $ age : num 25 34 28 52 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1 $ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
diabetes是一個(gè)因子;status是一個(gè)有序型因子。
#顯示對(duì)象的統(tǒng)計(jì)概要summary(patientdata) patientID age diabetes status Min. :1.00 Min. :25.00 Type1:3 Excellent:1 1st Qu.:1.75 1st Qu.:27.25 Type2:1 Improved :1 Median :2.50 Median :31.00 Poor :2 Mean :2.50 Mean :34.75 3rd Qu.:3.25 3rd Qu.:38.50 Max. :4.00 Max. :52.00
函數(shù)summary()會(huì)區(qū)別對(duì)待各個(gè)變量:
顯示連續(xù)型變量age的最小值、最大值、均值和各四分位數(shù);
顯示類(lèi)別型變量diabetes和status(各水平)的頻數(shù)值。
7. 列表
列表(list)是一些對(duì)象(或成分,component)的有序集合,某個(gè)列表中可能是若干向量、矩陣、數(shù)據(jù)框,甚至其他列表的組合。
使用函數(shù)list()創(chuàng)建列表:
mylist <- list(object1, object2, ...)
可以為列表中的對(duì)象命名:
mylist <- list(name1=object1, name2=object2, ...)
創(chuàng)建一個(gè)列表:
g <- "My First List"h <- c(25, 26, 18, 39)j <- matrix(1:10, nrow=5)k <- c("one", "two", "three")mylist <- list(title=g, ages=h, j, k) #創(chuàng)建列表mylist #輸出整個(gè)列表$title [1] "My First List"
$ages [1] 25 26 18 39
[[3]] [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10
[[4]] [1] "one" "two" "three"
mylist[[2]] #輸出第二個(gè)成分[1] 25 26 18 39mylist[["ages"]][1] 25 26 18 39
雙重方括號(hào)中指明代表某個(gè)成分的數(shù)字或名稱(chēng)訪(fǎng)問(wèn)列表中的元素。
注意事項(xiàng)
對(duì)象名稱(chēng)中的句點(diǎn)(.)沒(méi)有特殊意義
R中用美元符號(hào)($)指定一個(gè)數(shù)據(jù)框或列表中的某些部分。
將一個(gè)值賦給某個(gè)向量、矩陣、數(shù)組或列表中一個(gè)不存在的元素時(shí),R將自動(dòng)擴(kuò)展這個(gè)數(shù)據(jù)結(jié)構(gòu)以容納新值。
x <- c(8, 6, 4)x[7] <- 10x #通過(guò)賦值,向量x由三個(gè)元素?cái)U(kuò)展到了七個(gè)元素[1] 8 6 4 NA NA NA 10
x <- x[1:3] #重新將其縮減回三個(gè)元素x [1] 8 6 4
R中沒(méi)有標(biāo)量。標(biāo)量以單元素向量的形式出現(xiàn)。
R中的下標(biāo)不從0開(kāi)始,而從1開(kāi)始。在上述向量中,x[1]的值為8。
變量無(wú)法被聲明。它們?cè)谑状伪毁x值時(shí)生成。
2.2 數(shù)據(jù)輸入
1. 鍵盤(pán)輸入數(shù)據(jù)文本編輯器
edit()會(huì)自動(dòng)調(diào)用一個(gè)允許手動(dòng)輸入數(shù)據(jù)的文本編輯器。
mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))edit(mydata) #通過(guò)圖2-1所示文本編輯器輸入數(shù)據(jù),但結(jié)果并未保存 age gender weight 1 25 m 166 2 30 f 115 3 18 f 120 Warning message: In edit.data.frame(mydata) : 在'gender'里加上了因子水準(zhǔn)
圖2-1 通過(guò)文本編輯器輸入數(shù)據(jù)
mydata <- edit(mydata) #編輯的結(jié)果需要賦值回對(duì)象本身,結(jié)果保存在mydata中mydata age gender weight 1 25 m 166 2 30 f 115 3 18 f 120
語(yǔ)句 mydata<-edit(mydata)的一種等價(jià)寫(xiě)法是 fix(mydata)。
直接嵌入數(shù)據(jù)集mydatatxt <- " age gender weight 25 m 166 30 f 115 18 f 120 "mydata <- read.table(header=TRUE, text=mydatatxt) #read.table()函數(shù)被用于處理字符串并返回?cái)?shù)據(jù)框
鍵盤(pán)輸入數(shù)據(jù)的方式常用于處理小數(shù)據(jù)集。對(duì)于較大的數(shù)據(jù)集,可以從現(xiàn)有的文本文件、Excel電子表格、統(tǒng)計(jì)軟件或數(shù)據(jù)庫(kù)中導(dǎo)入數(shù)據(jù)。
2. 從帶分隔符的文本文件導(dǎo)入數(shù)據(jù)
可以使用read.table()從帶分隔符的文本文件中導(dǎo)入數(shù)據(jù)。其語(yǔ)法如下:
mydataframe<-read.table(file,options)
file是一個(gè)帶分隔符的ASCII文本文件
options是控制如何處理數(shù)據(jù)的選項(xiàng)
表2-1 函數(shù)read.table()的選項(xiàng)
選項(xiàng)描述header一個(gè)表示文件是否在第一行包含了變量名的邏輯型變量sep
分開(kāi)數(shù)據(jù)值的分隔符
默認(rèn)是 sep="",這表示了一個(gè)或多個(gè)空格、制表符、換行或回車(chē) sep=","讀取用逗號(hào)來(lái)分隔行內(nèi)數(shù)據(jù)的文件
sep=" "讀取使用制表符來(lái)分割行內(nèi)數(shù)據(jù)的文件
row.names一個(gè)用于指定一個(gè)或多個(gè)行標(biāo)記符的可選參數(shù)col.names如果數(shù)據(jù)文件的第一行不包括變量名(header=FASLE),可以用 col.names 去指定一個(gè)包含變量名的字符向量colClasses可以對(duì)每一列都指定一個(gè)類(lèi)(比如說(shuō),邏輯型、數(shù)值型、字符型或因子型)
例:用逗號(hào)分隔的文本文件studentgrades.csv,包含了學(xué)生在數(shù)學(xué)、科學(xué)、和社會(huì)學(xué)習(xí)的分?jǐn)?shù)。
StudentID,F(xiàn)irst,Last,Math,Science,Social Studies
011,Bob,Smith,90,80,67
012,Jane,Weary,75,,80
010,Dan,"Thornton, III",65,75,70
040,Mary,"O'Leary",90,95,92
setwd("~/目標(biāo)文件所在文件夾") #定位到目標(biāo)文件所在文件夾grades <‐ read.table("studentgrades.csv", header=TRUE, row.names="StudentID", sep=",") grades #顯示導(dǎo)入數(shù)據(jù) First Last Math Science Social.Studies 11 Bob Smith 90 80 67 12 Jane Weary 75 NA 80 10 Dan Thornton, III 65 75 70 40 Mary O'Leary 90 95 92
str(grades) 'data.frame': 4 obs. of 5 variables: $ First : Factor w/ 4 levels "Bob","Dan","Jane",..: 1 3 2 4 $ Last : Factor w/ 4 levels "O'Leary","Smith",..: 2 4 3 1 $ Math : int 90 75 65 90 $ Science : int 80 NA 75 95 $ Social.Studies: int 67 80 70 92
注意:
列StudentID現(xiàn)在是行名,不再有標(biāo)簽,也失去了前置的0
Dan的姓左右使用引號(hào),避免Thornton和III之間的空格
O’Leary左右使用引號(hào),否則R會(huì)把單引號(hào)讀取為分隔符
默認(rèn)地,read.table()把字符變量轉(zhuǎn)化為因子,可以加上選項(xiàng)stringsAsFactors=FALSE避免出現(xiàn)這種情況
可以用colClasses 選項(xiàng)去對(duì)每一列都指定一個(gè)類(lèi)
grades <- read.table("studentgrades.csv", header=TRUE, row.names="StudentID", sep=",", colClasses=c("character", "character", "character", "numeric", "numeric", "numeric"))grades First Last Math Science Social.Studies 011 Bob Smith 90 80 67 012 Jane Weary 75 NA 80 010 Dan Thornton, III 65 75 70 040 Mary O'Leary 90 95 92
str(grades) 'data.frame': 4 obs. of 5 variables: $ First : chr "Bob" "Jane" "Dan" "Mary" $ Last : chr "Smith" "Weary" "Thornton, III" "O'Leary" $ Math : num 90 75 65 90 $ Science : num 80 NA 75 95 $ Social.Studies: num 67 80 70 92
行名保留了前綴0,而且First和Last不再是因子;grades作為實(shí)數(shù)而不是整數(shù)來(lái)進(jìn)行排序。
可以用同樣的方法打開(kāi)txt格式的文本文件。
3. 導(dǎo)入Excel數(shù)據(jù)可以在Excel中將其導(dǎo)出為一個(gè)逗號(hào)分隔文件(csv),并使用前文描述的方式將其導(dǎo)入R中。可以用xlsx包直接導(dǎo)入
首先需要安裝xlsx包,xlsxjars和rJava包,以及一個(gè)正常工作的Java 安裝(http://java.com)。
函數(shù)read.xlsx()導(dǎo)入一個(gè)工作表到一個(gè)數(shù)據(jù)框中。格式是:
read.xlsx(file,n)
1. file是Excel工作簿的所在路徑
2. n則為要導(dǎo)入的工作表序號(hào)
例:從目標(biāo)文件夾的studentgrades.xlsx中導(dǎo)入了第一個(gè)工作表,并將其保存為一個(gè)數(shù)據(jù)框mydataframe。
library(xlsx)workbook <- "目標(biāo)文件夾/studentgrades.xlsx"mydataframe <- read.xlsx(workbook, 1)
R還可以從流行的統(tǒng)計(jì)軟件、特殊格式的文件、多種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)、專(zhuān)業(yè)數(shù)據(jù)庫(kù)、網(wǎng)站和在線(xiàn)服務(wù)中導(dǎo)入數(shù)據(jù)。具體方法可參見(jiàn)原書(shū)。
2.3 數(shù)據(jù)集的標(biāo)注
1. 變量標(biāo)簽——為變量名添加描述性的標(biāo)簽
可以將變量標(biāo)簽作為變量名,然后通過(guò)位置下標(biāo)來(lái)訪(fǎng)問(wèn)這個(gè)變量。
names(patientdata)[2] <- "Age at hospitalization (in years)"patientdata patientID Age at hospitalization (in years) diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type1 Poor
新的變量名太長(zhǎng),不適合重復(fù)輸入,可以使用patientdata[2]來(lái)引用這個(gè)變量。
patientdata[2] Age at hospitalization (in years) 1 25 2 34 3 28 4 522. 值標(biāo)簽——為類(lèi)別型變量中的編碼添加值標(biāo)簽
函數(shù)factor()可為類(lèi)別型變量創(chuàng)建值標(biāo)簽。
patientdata$gender <- factor(patientdata$gender, levels = c(1,2), labels = c("male", "female"))
levels代表變量的實(shí)際值
labels表示包含了理想值標(biāo)簽的字符型向量
2.4 處理數(shù)據(jù)對(duì)象的實(shí)用函數(shù)
表2-2 處理數(shù)據(jù)對(duì)象的實(shí)用函數(shù)
函數(shù)用途length(object)顯示對(duì)象中元素/成分的數(shù)量dim(object)顯示某個(gè)對(duì)象的維度str(object)顯示某個(gè)對(duì)象的結(jié)構(gòu)class(object)顯示某個(gè)對(duì)象的類(lèi)或類(lèi)型mode(object)顯示某個(gè)對(duì)象的模式names(object)顯示某對(duì)象中各成分的名稱(chēng)c(object, object,...)將對(duì)象合并入一個(gè)向量cbind(object, object, ...)按列合并對(duì)象rbind(object, object, ...)按行合并對(duì)象object輸出某個(gè)對(duì)象head(object)列出某個(gè)對(duì)象的開(kāi)始部分tail(object)列出某個(gè)對(duì)象的最后部分ls()顯示當(dāng)前的對(duì)象列表rm(object, object, ...)刪除一個(gè)或更多個(gè)對(duì)象語(yǔ)句 rm(list = ls())將刪除當(dāng)前工作環(huán)境中的幾乎所有對(duì)象newobject<- edit(object)編輯對(duì)象并另存為 newobjectfix(object)直接編輯對(duì)象

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線(xiàn)大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線(xiàn)下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線(xiàn)會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線(xiàn)自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?