R 语言重塑函数
示例
用于重塑数据的最灵活的基本R函数是reshape。
#创建不平衡纵向(面板)数据集 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.frames是不平衡的,也就是说,单元2在第一个周期中缺少观测值,而单元3和4在第二个周期中缺少观测值。另外,请注意,有两个变量随时间变化:计数和值,以及两个不变的变量:标识符和位置。
长到宽
要重塑data.frame宽幅格式,
#根据时间变量重塑宽度 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 indf.widenames for counts and values names(df.wide)[grep("\\.", names(df.wide))] <- gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
现在,简单的语法将产生有关未定义列的错误。
对于使reshape函数难以自动解析的列名,有时需要添加“varying”参数,该参数指示reshape以宽格式分组特定变量以将其转换为长格式。此参数采用变量名称或索引的向量列表。
reshape(df.wide, idvar="identifier", varying=list(c(3,5,7), c(4,6,8)), direction="long")
长整型时,可以提供“v.names”参数来重命名结果变量。
有时,可以通过使用“sep”自变量避免使用“varying”的规范,reshape该变量告诉变量名的哪一部分指定值自变量,哪个变量指定时间自变量。