前言
繪制統計圖形時,半數以上的時間會花在調用繪圖命令之前的數據塑型操作上。因為在把數據送進繪圖函數前,還得將數據框轉換為適當格式才行。
本文將給出使用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")
壓扁后的效果:
小結
在調用任何圖像繪制函數之前,都要按照繪圖函數的要求擺放好數據,這個過程也被稱為數據塑型。本文的部分功能可能讀者會疑惑有啥用,別着急,先進入到有趣的繪制章節部分吧。隨着繪圖次數增多,慢慢就會懂了。