重塑数据

通常数据来自表格。通常,人们可以将这种表格数据分为宽格式和长格式。在宽格式中,每个变量都有自己的列。

高度[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)