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

时间:2015-08-12 16:26:19

标签: r reshape

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

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变量,而color是描述性统计信息,在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

我似乎面临的挑战是没有“时间变量”。

2 个答案:

答案 0 :(得分:5)

通过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')

答案 1 :(得分:2)

我们可以使用dcast版本的data.table中的devel,即v1.9.5 +。我们创建了一个序列变量(&#39; indx&#39;),按照&#39; cat&#39;和&#39; color&#39;柱。然后dcast来自&#39; long&#39;广泛的&#39;并指定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

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

通过与getanID

组合splitstackshape(以创建序列变量),可以使其变得紧凑
  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