【问题标题】:Grouping key/value columns into single rows将键/值列分组为单行
【发布时间】:2015-09-04 23:26:53
【问题描述】:

我正在尝试采用键值组合并将所有值与键放在同一行。我很确定我曾经知道如何做到这一点(我认为使用 data.table)并且我一直在研究通常的嫌疑人 reshape2、tidyr、data.table 等,但我似乎无法弄清楚出一个简单的解决方案。

key1 = c(1,1,1,1,2,2,2,2)
key2 = c("A","A","B","B","C","C","D","D")
value = c("a","b","c","d","e","f","g","h")
kvframe = data.frame(key1,key2,value)

#  key1 key2 value
#1    1    A     a
#2    1    A     b
#3    1    B     c
#4    1    B     d
#5    2    C     e
#6    2    C     f
#7    2    D     g
#8    2    D     h

这是我希望表格的样子:

# key1 key2 value1 value2
#    1    A      a      b
#    1    B      c      d
#    2    C      e      f
#    2    D      g      h

大多数 key1,key2 对具有相同数量的对应值,但并非全部都如此。我希望有一个解决方案,其值列数等于任何给定键集的最大值数,其中任何值较少的对都用 NA 填充。

【问题讨论】:

    标签: r dataframe data.table tidyr


    【解决方案1】:

    您需要组“key1/key2”的序列列。

    library(data.table) # v1.9.5+
    setDT(kvframe)[, Seq := paste0('value', 1:.N), by = .(key1, key2)] # generate Seq
    dcast(kvframe, key1 + key2  ~Seq, value.var = 'value') # cast from long to wide
    
    #   key1 key2 value1 value2
    #1:    1    A      a      b
    #2:    1    B      c      d
    #3:    2    C      e      f
    #4:    2    D      g      h
    

    或者使用来自base Rreshape

     d1 <- transform(kvframe, Seq=ave(seq_along(value),
                  key1, key2, FUN=seq_along))
     reshape(d1, idvar=c('key1', 'key2'), timevar='Seq', direction='wide')
     #  key1 key2 value.1 value.2
     #1    1    A       a       b
     #3    1    B       c       d
     #5    2    C       e       f
     #7    2    D       g       h
    

    或者

    library(tidyr)
    spread(d1, Seq, value)
    

    【讨论】:

    • @akrun 在附近时,我不需要在这里提供帮助。令人难以置信的快速和准确 - 始终如此。我印象深刻。
    • @RHertel 感谢您的 cmets。我在过去看到过类似的问题。这就是快速回复的原因。
    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2013-10-27
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多