重塑数据
通常数据来自表格。通常,人们可以将这种表格数据分为宽格式和长格式。在宽格式中,每个变量都有自己的列。
人 | 高度[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)