R:将无序长数据转换为宽数据

R: Transform unordered long data to wide data

我希望将无序的长数据转换为宽数据。

mydata <- data.frame(cat   = c('a','a','a','b','c','c','c','c'),
                     color = c(  1,  1,  1,  2,  1,  1,  1,  1),
                     hat   = c(  1,  1,  2,  2,  1,  2,  1,  2),
                     shoe  = c(  0,  1,  1,  2,  1,  1,  1,  3))

cat 是 ID 变量,而颜色是描述性统计量,在 cat.

内不会改变
mydata
    cat color hat shoe
1     a     1   1    0
2     a     1   1    1
3     a     1   2    1
4     b     2   2    2
5     c     1   1    1
6     c     1   2    1
7     c     1   1    1
8     c     1   2    3

最终输出

  cat color hat1 shoe1 hat2 shoe2 hat3 shoe3 hat4 shoe4
1   a     1    1     0    1     1    2     1   NA    NA
2   b     2    2     2   NA    NA   NA    NA   NA    NA
3   c     1    1     1    2     1    1     1    2     3

我似乎面临的挑战是没有"time variable"。

通过 cat 添加一个计数器,然后您可以将其用作您的时间变量:

library(data.table)
mydata <- data.table(cat   = c('a','a','a','b','c','c','c','c'),
                 color = c(  1,  1,  1,  2,  1,  1,  1,  1),
                 hat   = c(  1,  1,  2,  2,  1,  2,  1,  2),
                 shoe  = c(  0,  1,  1,  2,  1,  1,  1,  3))

mydata[, "dummy.id" := seq(.N), by=cat]
widedata <- reshape(mydata, idvar='cat', timevar='dummy.id', direction='wide')

我们可以使用 data.table 的 devel 版本的 dcast,即 v1.9.5+。我们创建一个按 'cat' 和 'color' 列分组的序列变量 ('indx')。然后 dcast 从 'long' 到 'wide' 并指定 value.var 列。

 library(data.table)#v1.9.5+
 mydata[, indx:=1:.N, by = .(cat, color)]
 dcast(mydata, cat+color~indx, value.var=c('hat', 'shoe'))
 #     cat color hat_1 hat_2 hat_3 hat_4 shoe_1 shoe_2 shoe_3 shoe_4
 #1:   a     1     1     1     2    NA      0      1      1     NA
 #2:   b     2     2    NA    NA    NA      2     NA     NA     NA
 #3:   c     1     1     2     1     2      1      1      1      3

注意:安装开发版本的说明是 here

这可以通过结合来自 splitstackshape

getanID(创建序列变量)来变得紧凑
  library(splitstackshape)
  dcast(getanID(mydata, c('cat', 'color')), 
              cat+color~.id, value.var=c('hat', 'shoe'), sep='')
  #   cat color  hat1  hat2  hat3  hat4  shoe1  shoe2  shoe3  shoe4
  #1:   a     1     1     1     2    NA      0      1      1     NA
  #2:   b     2     2    NA    NA    NA      2     NA     NA     NA
  #3:   c     1     1     2     1     2      1      1      1      3