当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R reshape 重塑分组数据


R语言 reshape 位于 stats 包(package)。

说明

此函数在 ‘wide’ 格式(在同一行的不同列中重复测量)和 ‘long’ 格式(在不同行中重复测量)之间重塑数据帧。

用法

reshape(data, varying = NULL, v.names = NULL, timevar = "time",
        idvar = "id", ids = 1:NROW(data),
        times = seq_along(varying[[1]]),
        drop = NULL, direction, new.row.names = NULL,
        sep = ".",
        split = if (sep == "") {
            list(regexp = "[A-Za-z][0-9]", include = TRUE)
        } else {
            list(regexp = sep, include = FALSE, fixed = TRUE)}
        )

### Typical usage for converting from long to wide format:

# reshape(data, direction = "wide",
#         idvar = "___", timevar = "___", # mandatory
#         v.names = c(___),    # time-varying variables
#         varying = list(___)) # auto-generated if missing

### Typical usage for converting from wide to long format:

### If names of wide-format variables are in a 'nice' format

# reshape(data, direction = "long",
#         varying = c(___), # vector 
#         sep)              # to help guess 'v.names' and 'times'

### To specify long-format variable names explicitly

# reshape(data, direction = "long",
#         varying = ___,  # list / matrix / vector (use with care)
#         v.names = ___,  # vector of variable names in long format
#         timevar, times, # name / values of constructed time variable
#         idvar, ids)     # name / values of constructed id variable

参数

data

一个 DataFrame

varying

宽格式变量集的名称,对应于长格式的单个变量(‘time-varying’)。这通常是变量名称向量的列表,但它可以选择是名称矩阵或单个名称向量。在每种情况下,当 direction = "long" 时,名称可以替换为被解释为引用 names(data) 的索引。有关更多详细信息和选项,请参阅“详细信息”。

v.names

长格式的变量名称对应于宽格式的多个变量。查看具体信息'。

timevar

长格式的变量,用于区分来自同一组或个人的多个记录。如果有多个记录匹配,则将采用第一个记录(并带有警告)。

idvar

一个或多个长格式变量的名称,用于标识同一组/个人的多个记录。这些变量也可以以宽格式存在。

ids

用于新创建的长格式 idvar 变量的值。

times

用于新创建的长格式 timevar 变量的值。查看具体信息'。

drop

重塑之前要删除的变量名称向量。

direction

字符串,部分匹配 "wide" 以重塑为宽格式,或 "long" 以重塑为长格式。

new.row.names

字符或 NULL :非空值将用于结果的行名称。

sep

长度为1的字符向量,表示宽格式变量名称中的分隔字符。这用于根据 varying 中的名称猜测 v.namestimes 参数。如果是 sep == "" ,则分割位置就在字母字符后面的第一个数字之前。这也用于在重塑为宽格式时创建变量名称。

split

包含三个组件的列表: regexpinclude 和(可选)fixed 。这允许变量名称分割的扩展接口。查看具体信息'。

细节

尽管 reshape() 可以在各种上下文中使用,但激发应用程序的是来自纵向研究的数据,并且该函数的参数以这些术语命名和说明。纵向研究的特点是在不同时间点(假设所有单位都相同)重复测量每个被研究单位(例如个人)的相同变量,例如身高和体重。这些变量称为time-varying变量。研究可能包括每个单元仅测量一次且不随时间变化的其他变量(例如性别和种族);这些称为time-constant变量。

纵向数据集的 ‘wide’ 格式表示每个单元将有一个记录(行),通常包含一些占据单列的 time-constant 变量,以及一些占据多列的 time-varying 变量(每个时间点一列) )。同一数据集的 ‘long’ 格式表示对于每个个体将有多个记录(行),time-constant 变量在这些记录中保持不变,time-varying 变量在记录中变化。 ‘long’ 格式数据集将有两个附加变量:‘time’ 变量标识每个记录来自哪个时间点,‘id’ 变量显示哪些记录引用同一单位。

转换类型(长到宽或宽到长)由 direction 参数确定,除非 data 参数是先前调用 reshape 的结果,否则该参数是强制的。在这种情况下,只需使用 reshape(data) 即可反转操作(其他参数作为属性存储在数据帧上)。

使用 direction = "wide" 从长格式转换为宽格式是更简单的操作,主要在多变量分析中有用,其中数据通常被期望为 wide-format 矩阵。在这种情况下,必须指定时间变量timevar和id变量idvar。所有其他变量均假定为time-varying,除非通过v.names 参数显式指定time-varying 变量。如果 time-constant 变量实际上不是常量,则会发出警告。

每个time-varying变量都以宽格式扩展为多个变量。这些扩展变量的名称是自动生成的,除非它们以列表(或矩阵)的形式指定为 varying 参数,每个 time-varying 变量有一个组件(或行)。如果 varying 是名称向量,则会隐式转换为矩阵,每个 time-varying 变量占一行。如果有多个 time-varying 变量,请谨慎使用此选项,因为排序(按列,matrix 构造函数中的默认值)可能不直观,而显式列表或矩阵形式是明确的。

使用 direction = "long" 从宽格式转换为长格式是更常见的操作,因为大多数(单变量)统计建模函数都期望长格式的数据。在只有一个 time-varying 变量的简单情况下,宽格式输入中的相应列可以指定为 varying 参数,该参数可以是列名称向量或相应的列索引。组合这些列的长格式输出中相应变量的名称可以选择指定为 v.names 参数,并将时间变量的名称指定为 timevar 参数。用作与宽格式中不同列相对应的时间值的值可以指定为times 参数。如果未指定 v.names,该函数将尝试从 varying 猜测 v.namestimes(在这种情况下,未使用显式指定的 times 参数)。默认值需要像 x.1x.2 这样的变量名称,其中 sep = "." 指定在点处拆分并将其从名称中删除。要让字母顺序后跟数字时间,请使用 sep = ""

可以通过两种方式指定多个 time-varying 变量,即使用 varying 作为上述原子向量,或作为列表(或矩阵)。如果使用如上所述的自动变量名称分割,第一种形式是有用的(并且是强制性的);这要求所有 time-varying 变量的名称以相同的方式进行适当格式化,并且 v.names 未指定。如果varying是一个列表(每个time-varying变量有一个组成部分)或一个矩阵(每个time-varying变量有一行),则不会尝试变量名称拆分,并且v.namestimes通常需要被指定,尽管它们将分别默认为每个集合中的第一个变量名称和顺序时间。

此外,如果显式给出 v.names,则不会尝试猜测,即使 varying 是原子向量。在这种情况下, time-varying 变量的数量被视为 v.names 的长度,并且 varying 被隐式转换为矩阵,每个 time-varying 变量占一行。与长到宽转换的情况一样,矩阵是按列填充的,因此需要注意 varying 中变量名称(或索引)的顺序,就像 x.1 一样, y.1x.2y.2 (即同一时间点对应的变量需要分组在一起)。

split 参数通常不是必需的。 split$regexp 组件传递给 strsplitregexpr ,如果 split$includeTRUE ,则使用后者,在这种情况下,拆分发生在匹配字符串的第一个字符之后。在 strsplit 情况下,分隔符不包含在结果中,并且可以使用 split$fixed 指定 fixed-string 匹配。

重新整形后的 DataFrame 添加了属性,以简化重新整形回到原始形式的过程。

例子

summary(Indometh) # data in long format

## long to wide (direction = "wide") requires idvar and timevar at a minimum
reshape(Indometh, direction = "wide", idvar = "Subject", timevar = "time")

## can also explicitly specify name of combined variable
wide <- reshape(Indometh, direction = "wide", idvar = "Subject",
                timevar = "time", v.names = "conc", sep= "_")
wide

## reverse transformation
reshape(wide, direction = "long")
reshape(wide, idvar = "Subject", varying = list(2:12),
        v.names = "conc", direction = "long")

## times need not be numeric
df <- data.frame(id = rep(1:4, rep(2,4)),
                 visit = I(rep(c("Before","After"), 4)),
                 x = rnorm(4), y = runif(4))
df
reshape(df, timevar = "visit", idvar = "id", direction = "wide")
## warns that y is really varying
reshape(df, timevar = "visit", idvar = "id", direction = "wide", v.names = "x")


##  unbalanced 'long' data leads to NA fill in 'wide' form
df2 <- df[1:7, ]
df2
reshape(df2, timevar = "visit", idvar = "id", direction = "wide")

## Alternative regular expressions for guessing names
df3 <- data.frame(id = 1:4, age = c(40,50,60,50), dose1 = c(1,2,1,2),
                  dose2 = c(2,1,2,1), dose4 = c(3,3,3,3))
reshape(df3, direction = "long", varying = 3:5, sep = "")


## an example that isn't longitudinal data
state.x77 <- as.data.frame(state.x77)
long <- reshape(state.x77, idvar = "state", ids = row.names(state.x77),
                times = names(state.x77), timevar = "Characteristic",
                varying = list(names(state.x77)), direction = "long")

reshape(long, direction = "wide")

reshape(long, direction = "wide", new.row.names = unique(long$state))

## multiple id variables
df3 <- data.frame(school = rep(1:3, each = 4), class = rep(9:10, 6),
                  time = rep(c(1,1,2,2), 3), score = rnorm(12))
wide <- reshape(df3, idvar = c("school", "class"), direction = "wide")
wide
## transform back
reshape(wide)

也可以看看

stackapermrelist 用于重塑 unlist 的结果。 xtabsas.data.frame.table 用于创建列联表并将其转换回数据帧。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Reshape Grouped Data。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。