【问题标题】:R: Transform unordered long data to wide dataR:将无序的长数据转换为宽数据
【发布时间】:2015-08-12 16:26:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: r reshape


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我们可以使用来自devel 版本的data.table 的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
      

      注意:安装devel版本的说明是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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        相关资源
        最近更新 更多