重塑資料

通常資料來自表格。通常,人們可以將這種表格資料分為寬格式和長格式。在寬格式中,每個變數都有自己的列。

高度[cm] 年齡[年]
艾莉森 178 20
短髮 174 45
卡爾 182 31

但是,有時使用長格式會更方便,其中所有變數都在一列中,值在第二列中。

變數
艾莉森 高度[cm] 178
短髮 高度[cm] 174
卡爾 高度[cm] 182
艾莉森 年齡[年] 20
短髮 年齡[年] 45
卡爾 年齡[年] 31

Base R 以及第三方軟體包可用於簡化此過程。對於每個選項,將使用 mtcars 資料集。預設情況下,此資料集採用長格式。為了使包能夠工作,我們將插入行名作為第一列。

mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)

基地 R.

基 R 中有兩個函式可用於在寬格式和長格式之間進行轉換:stack()unstack()

long <- stack(data)
long # this shows the long format
wide <- unstack(long)    
wide # this shows the wide format

但是,對於更高階的用例,這些功能可能變得非常複雜。幸運的是,還有其他選擇使用第三方軟體包。

tidyr 包

這個軟體包使用 gather() 從寬到長和 spread() 轉換為從長到寬的轉換。

library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the 
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)

data.table 包

data.table 包擴充套件了 reshape2 的功能,並使用函式 melt() 從寬到長,dcast() 從長到寬。

library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)