第二篇:R語言數據可視化之數據塑形技術

前言

        繪製統計圖形時,半數以上的時間會花在調用繪圖命令以前的數據塑型操做上。由於在把數據送進繪圖函數前,還得將數據框轉換爲適當格式才行。        函數

        本文將給出使用R語言進行數據塑型的一些基本的技巧,更多技術細節推薦參考《R語言核心手冊》。spa

數據框塑型

        1. 建立數據框 - data.frame()orm

# 建立向量p
p = c("A", "B", "C")
# 建立向量q
q = 1:3
# 建立數據框:含p/q兩列
dat = data.frame(p, q)

        結果展現: blog

        2. 查看數據框信息 - str()排序

# 展現數據集dat信息
str(dat)

        結果展現:it

        3. 向數據框添加列io

        基本格式爲:數據框$新列名 = 向量名。以下代碼將在dat數據集中建立名爲newcol的列,並將向量v賦值給它:ast

dat$newcol = v

        若是向量長度小於數據框的行數,R會重複這個向量,直到全部行被填充。form

        4. 從數據框中刪除列class

        能夠將NULL賦值給某列便可。以下代碼將刪除數據集中的badcol列:

dat$badcol = NULL

        也可使用subset函數(後面會具體講),並將一個減號至於待刪除的列前:

dat = subset(data, select = -badcol)

        5. 重命名數據框中的列名

        能夠將列名稱向量賦值給names函數:

names(dat) = c("name1", "name2", "name3")

        若是想經過列名重命名某一列能夠這樣:

# 將名爲ctrl的列改名爲Cntrol
names(anthoming)[names(anthoming) == "ctrl"] = c("Cntrol")

        6. 重排序數據框的列

        能夠經過數值位置重排序:

# 經過列的數值位置重排序
dat = dat[c(1,3,2)]

        也能夠經過列的名稱重排序:

# 經過列的名稱重排序
dat = dat[c("col1", "col3", "col2")]

        7. 從數據框提取子集 - subset()

        以下R語言代碼從climate數據框中,選定Source屬性爲"Berkeley"的記錄的"Year"、"Anomaly10y"兩列:

# subset函數:首參選定數據集, Source參數選定行,select參選定列
subset(climate, Source == "Berkeley", select = c(Year, Anomaly10y))

因子水平塑型

        1. 根據數據的值改變因子水平順序 - reorder()

        下面這個例子將根據count列對spray列中的因子水平進行重排序,彙總數據爲mean:

# reorder函數:首參選定因子向量,次參選定排序依據的數據向量,FUN參數選定彙總函數
iss$spray = reorder(iss$spray, iss$count, FUN = mean)

        2. 改變因子水平的名稱 - revalue() / mapvalues() in plyr包

        以下兩行R語言代碼都可將水平因子f中名爲"small","medium","large"的因子分別改名爲"S","M", "L":

# 方法一
f = revalue(f, c(small = "S", medium = "M", large = "L"))
# 方法二
f = mapvalues(f, c("small", "medium", "large"), c("S", "M", "L"))

        3. 去掉因子中再也不使用的水平 - droplevels()

        以下R語言代碼將剔除掉因子f中多餘的水平:

droplevels(f)

變量塑型

        1. 變量替換 - match()

        要將某些值替換爲其餘特定值,可以使用match函數。以下R語言代碼將數據框pg的group列的oldvals中的"ctr1","trt1","trt2"的值分別替換爲"No","Yes","Yes":

# 舊值
oldvals = c("ctrl1", "trt1", "trt2")
# 新值
newvals = factor(c("No", "Yes", "Yes"))
# 替換
pg$treatment = newvals[match(pg$group, oldvals)]

        2. 分組轉換數據 - ddply() in plyr包

        經過使用ddply()函數的transform參數功能,可以對不一樣分組內的數據進行轉換。以下R語代碼可以將cabbages數據框按照Cult列因子進行分組,並在數據框中建立一個新的名爲DevWt的列,該新列值由原某列值減分組均值獲得:

# ddply函數:首參選定數據框,次參選定分組變量,叄參選定處理方式,肆參輸出新列
cb = ddply(cabbages, "Cult", transform, DevWt = HeadWt - mean(HeadWt))

        3. 分組彙總數據 - ddply() in plyr包

        經過使用ddply()函數的transform參數功能,可以對不一樣分組內的數據進行彙總。彙總和上面介紹的轉換的區別在於彙總結果的記錄數等於分組的個數,而轉換操做後記錄數是不變的,只是對原列進行改動轉換。以下R語言代碼將cabbages數據框按照Cult和Date列因子進行分組,並在數據框中建立一個新的名爲DevWt的列,該新列值由對每一個分組進行均值統計獲得:

# ddply函數:首參選定數據框,次參選定分組變量,叄參選定處理方式,肆參輸出新列
cb = ddply(cabbages, c("Cult", "date"), summarise, Weight = mean(HeadWt))

 長/寬數據塑型

        1. 寬數據 -> 長數據 - melt() in reshape2包

        anthoming數據集以下所示:

        其中expt和ctrl兩列能夠合併爲一列。合併後的數據框相對合並前的叫長數據,而合併前的數據框相對合並後的數據叫寬數據,是否是很貼切呢?

        以下R語言代碼使用melt函數將上述數據集"拉長":

# melt函數:首參選定數據框,次參選定記錄標識列,variable.name選定拉長後的屬性名列,value.name選定拉長後的屬性值列
melt(anthoming, id.vars = "angle", variable.name = "condition", value.name = "count")

        拉長後的效果:

        2. 長數據 -> 寬數據 - dcast() in reshape2包

        plum數據集以下所示:

        該數據框中length列和time列做爲標識列, 以下R語言代碼可將該數據框壓扁:

# dcast函數:首參選定數據框,次參選定記錄標識列和新的屬性名列,value.var選定被拉長的屬性值列
dcast(plum, length + time ~ survival, value.var = "count")

        壓扁後的效果:

小結

        在調用任何圖像繪製函數以前,都要按照繪圖函數的要求擺放好數據,這個過程也被稱爲數據塑型。本文的部分功能可能讀者會疑惑有啥用,彆着急,先進入到有趣的繪製章節部分吧。隨着繪圖次數增多,慢慢就會懂了。

相關文章
相關標籤/搜索