如何将数据从长格式转换为宽格式

我在重新排列下面的数据帧时遇到了麻烦:

set.seed(45)
dat1 <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )
dat1
       name  numbers      value1  firstName       1  0.34079972  firstName       2 -0.70334033  firstName       3 -0.37953774  firstName       4 -0.74604745 secondName       1 -0.89810736 secondName       2 -0.33479417 secondName       3 -0.50137828 secondName       4 -0.1745357

我想重新调整它的形状,使每个唯一的“ name”变量成为一个行名,其中“ values”作为该行的观察值,“ numbers”作为冒号。有点像这样:

 name          1          2          3         41  firstName  0.3407997 -0.7033403 -0.3795377 -0.74604745 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

我已经看了melt和cast 以及其他一些东西,但似乎没有一个能做到这一点。

好说。使用 reshape 函数:
reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")

新的tidyr 软件包能搞定,gather()/spread()是melt/cast的术语。
library(tidyr)
spread(dat1, key = numbers, value = value)
摘自 github,
Tidyr 是一个 reshape2的重构,旨在配合整洁的数据框架,并与 magritr 和 dplyr 携手工作,以建立一个坚实的数据分析通道。
正如 reform 比 reform 少一样,tidyr 比 reform 少一样。 它是专门为整理数据而设计的,而不是重塑数据的整体重塑,或重塑数据的整体聚合。特别是,内置方法仅适用于数据帧,而 tidyr 不提供边距或聚合。

您可以通过 reshape()函数或重塑包中的 melt () / cast ()函数来实现这一点。 对于第二个选项,示例代码为
library(reshape)
cast(dat1, name ~ numbers)
或者使用 reshape2
library(reshape2)
dcast(dat1, name ~ numbers)

如果需要考虑性能的话,另一个选择是使用 data.table 对 reshape2的 melt & dcast 函数的扩展

library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
#          name          1          2         3         4# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814

而且,从 data.table v1.9.6开始,我们可以在多列上进行强制转换

## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627