This question already has answers here:
Reshaping multiple sets of measurement columns (wide format) into single columns (long format)

(7个答案)


3年前关闭。




我需要将宽表重整为长格式,但为每个记录保留多个字段,例如:
dw <- read.table(header=T, text='
 sbj f1.avg f1.sd f2.avg f2.sd  blabla
   A   10    6     50     10      bA
   B   12    5     70     11      bB
   C   20    7     20     8       bC
   D   22    8     22     9       bD
 ')

# Now I want to melt this table, keeping both AVG and SD as separate fields for each measurement, to get something like this:

 #    sbj var avg  sd  blabla
 #     A   f1  10  6     bA
 #     A   f2  50  10    bA
 #     B   f1  12  5     bB
 #     B   f2  70  11    bB
 #     C   f1  20  7     bC
 #     C   f2  20  8     bC
 #     D   f1  22  8     bD
 #     D   f2  22  9     bD

我具有使用meltreshape的基本知识,但是对于我来说如何应用这种重塑并不明显。

最佳答案

reshape使用适当的参数执行此操作。
varying列出以宽格式存在但以长格式分成多行的列。 v.names是等效的长格式。在两者之间,创建映射。

?reshape:



给定这些varyingv.names参数,reshape足够聪明,可以看到我已指定索引在此处的点之前(即1.x,1.y,2.x,2.y顺序)。请注意,原始数据具有按此顺序排列的列,因此我们可以为此示例数据指定varying=2:5,但这通常并不安全。

给定timesv.names的值后,reshapevarying字符上的.列拆分(默认的sep参数)以在输出中创建这些列。
times指定将在创建的var列中使用的值,并将v.names粘贴到这些值上以获取宽格式的列名,以映射到结果。

最后,idvar被指定为sbj列,该列标识宽格式的各个记录(感谢@thelatemail)。

reshape(dw, direction='long',
        varying=c('f1.avg', 'f1.sd', 'f2.avg', 'f2.sd'),
        timevar='var',
        times=c('f1', 'f2'),
        v.names=c('avg', 'sd'),
        idvar='sbj')

##      sbj blabla var avg sd
## A.f1   A     bA  f1  10  6
## B.f1   B     bB  f1  12  5
## C.f1   C     bC  f1  20  7
## D.f1   D     bD  f1  22  8
## A.f2   A     bA  f2  50 10
## B.f2   B     bB  f2  70 11
## C.f2   C     bC  f2  20  8
## D.f2   D     bD  f2  22  9

关于r - 将多个值列从宽变长为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23945350/

10-12 20:46