前言
繪製統計圖形時,半數以上的時間會花在呼叫繪圖命令之前的資料塑型操作上。因為在把資料送進繪圖函式前,還得將資料框轉換為適當格式才行。
本文將給出使用R語言進行資料塑型的一些基本的技巧,更多技術細節推薦參考《R語言核心手冊》。
資料框塑型
1. 建立資料框 - data.frame()
# 建立向量p p = c("A", "B", "C") # 建立向量q q = 1:3 # 建立資料框:含p/q兩列 dat = data.frame(p, q)
結果展示:
2. 檢視資料框資訊 - str()
# 展示資料集dat資訊 str(dat)
結果展示:
3. 向資料框新增列
基本格式為:資料框$新列名 = 向量名。如下程式碼將在dat資料集中建立名為newcol的列,並將向量v賦值給它:
dat$newcol = v
如果向量長度小於資料框的行數,R會重複這個向量,直到所有行被填充。
4. 從資料框中刪除列
可以將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")
壓扁後的效果:
小結
在呼叫任何影象繪製函式之前,都要按照繪圖函式的要求擺放好資料,這個過程也被稱為資料塑型。本文的部分功能可能讀者會疑惑有啥用,彆著急,先進入到有趣的繪製章節部分吧。隨著繪圖次數增多,慢慢就會懂了。