重塑資料
通常資料來自表格。通常,人們可以將這種表格資料分為寬格式和長格式。在寬格式中,每個變數都有自己的列。
人 | 高度[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)