在實驗數據產出之后,繪制圖形時存在兩個問題,首先是數據錄入格式的問題,其次是數據轉換的問題。
(一):數據錄入[1]
舉例:用兩種飼料喂食橘小實蠅(處理),4個生物重復,待其性成熟后每日統計產卵量,連續統計4天,試錄入數據。
1.1 寬數據格式
寬數據是指數據集對所有的變量進行了明確的細分,各變量的值不存在重復循環的情況也無法歸類。數據總體的表現為變量多而觀察值少。
寬格式
1.2 長數據格式
長數據一般是指數據集中的變量沒有做明確的細分,即變量中至少有一個變量中的元素存在值嚴重重復循環的情況(可以歸為幾類),表格整體的形狀為長方形,即 變量少而觀察值多。
長數據
(二):數據轉換
2.1 reshape2包
Reshape包主要是用來做數據變形的。其中主要的有兩個函數melt和dcast1。其中melt主要用于寬變長,而dcast1主要用于長變寬。
2.1.1 寬格式轉長格式[2]
# 數組(array)類型
datax <- array(1:8, dim=c(2,2,2))
melt(datax)
# 列表數據
melt(data, id.vars, measure.vars,
variable.name = "variable", ..., na.rm = FALSE,
value.name = "value")
- id.vars 是被當做維度的列變量,每個變量在結果中占一列;
- measure.vars 是被當成觀測值的列變量,它們的列變量名稱和值分別組成 variable 和 value兩列;
- 列變量名稱用variable.name 和 value.name來指定。
var.ids 可以寫成id,measure.vars可以寫成measure。id(即var.ids)和觀測值(即measure.vars)這兩個參數可以只指定其中一個,剩余的列被當成另外一個參數的值;如果兩個都省略,數值型的列被看成觀測值,其他的被當成id。如果想省略參數或者去掉部分數據,參數名最好用 id/measure,否則得到的結果很可能不是你要的。
2.1.2 長格式轉寬格式[3]
- dcast:針對數據框
- acast:針對向量、矩陣、數組
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL,
fill = NULL, drop = TRUE,value.var = guess_value(data))
- data:以溶解的數據框(通常是melt函數創建的);
- formula:描述輸出結果的公式,比如x~y,則x表示數據透視表的行,y代表數據透視表的列;
- fun.aggregate:聚合函數。如果要聚合輸出結果中一溶解的數據,用這個參數可以設置聚合函數。可以使用自定義函數;
- margins:相當于透視表中的行總計和列總計;
- subset:選取滿足一些特定值的數據,相當于Excel透視表的篩選。例如, subset =.(variable ==“length”);
- value.var:存儲值的列的名稱。
2.2 tidyr包[4][5]
tidyr主要提供了一個類似Excel中數據透視表(pivot table)的功能;
gather和spread函數將數據在長格式和寬格式之間相互轉化,應用在比如稀疏矩陣和稠密矩陣之間的轉化;
2.2.1 寬格式轉長格式
# gather的用法
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
- data:需要被轉換的寬形表;
- key:將原數據框中的所有列賦給一個新變量key;
- value:將原數據框中的所有值賦給一個新變量value…:可以指定哪些列聚到同一列中;
- ...:包含值的源列的名稱;
- na.rm:是否刪除缺失值;
- convert=FALSE:是否需要進行類型轉換;
- factor_key=FALSE:是否存儲為字符向量,否則存儲為因子,按照原始順序排列。
2.2.2 長格式轉寬格式[5]
# spread的用法:
spread(data, key, value, fill = NA, convert = FALSE, drop =TRUE,
sep = NULL)
- data:為需要轉換的長形表;
- key:需要將變量值拓展為字段的變量;
- value:需要分散的值;
- fill:對于缺失值,可將fill的值賦值給被轉型后的缺失值。
(三):數據演示[6]
3.1 數據錄入
# 在寬格式和長格式之間轉換數據
rm(list = ls())
olddata_wide <- read.table(header=TRUE, text='
subject sex control cond1 cond2
1 M 7.9 12.3 10.7
2 F 6.3 10.6 11.1
3 F 9.5 13.1 13.8
4 M 11.5 13.4 12.9
')
# Make sure the subject column is a factor
olddata_wide$subject <- factor(olddata_wide$subject)
olddata_long <- read.table(header=TRUE, text='
subject sex condition measurement
1 M control 7.9
1 M cond1 12.3
1 M cond2 10.7
2 F control 6.3
2 F cond1 10.6
2 F cond2 11.1
3 F control 9.5
3 F cond1 13.1
3 F cond2 13.8
4 M control 11.5
4 M cond1 13.4
4 M cond2 12.9
')
# Make sure the subject column is a factor
olddata_long$subject <- factor(olddata_long$subject)
3.2 數據轉換
##################################寬數據轉換####################################
olddata_wide
# tidyr package
library(tidyr)
data_long <- gather(data = olddata_wide, key = condition,
value = measurement, control:cond2, factor_key = TRUE)
data_long
# reshape2 package
library(reshape2)
data_long <- melt(data = olddata_wide, id.vars=c("subject", "sex"),
measure.vars= c("control","cond1","cond2"),
variable.name = "variable", value.name = "value")
data_long
# 可以簡寫為 melt(olddata_wide, id.vars=c("subject", "sex"))
##################################長數據轉換####################################
olddata_long
# tidyr package
library(tidyr)
data_wide <- spread(data = olddata_long, key = condition, value = measurement)
data_wide
# reshape2 package
library(reshape2)
data_wide <- dcast(data = olddata_long, formula = subject + sex ~ condition,
value.var="measurement")
data_wide
參考資料: