重塑功能
用于重塑数据的最灵活的基本 R 函数是 reshape
。请参阅 ?reshape
的语法。
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
请注意,data.frame 是不平衡的,即单元 2 在第一个周期中缺少观察,而单元 3 和 4 在第二个周期中缺少观测值。另请注意,有两个变量在不同时期变化:计数和值,以及两个不变的变量:标识符和位置。
长到宽
要将 data.frame 重新整形为宽格式,
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
请注意,缺少的时间段用 NA 填充。
在重新整形时,“v.names”参数指定随时间变化的列。如果不需要位置变量,则可以在使用 drop
参数重新整形之前删除它。在从 data.frame 中删除唯一的非变量/非 id 列时,v.names 参数变得不必要。
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
从宽到长
要使用当前的 df.wide 进行重新整形,最小的语法就是
reshape(df.wide, direction="long")
但是,这通常比较棘手:
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
现在,简单的语法将产生有关未定义列的错误。
对于 reshape
函数更难以自动解析的列名,有时需要添加变化参数,该参数告诉 reshape
以宽格式对特定变量进行分组以转换为长格式。此参数采用变量名称或索引的向量列表。
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
在重新整形时,可以提供“v.names”参数来重命名生成的变量变量。
有时可以通过使用 sep
参数来避免变化的规范,该参数告诉 reshape
变量名的哪一部分指定了 value 参数,并指定了 time 参数。