我在重新排列下面的数据帧时遇到了麻烦:
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