【问题标题】:split columns according to sequence numbers根据序列号拆分列
【发布时间】:2017-01-04 15:33:57
【问题描述】:

我有一个这样的数据集:

seq X
1   a
2   b
3   c
1   d
2   e
1   f
2   g
3   h
4   i
5   j

我想根据分配的序列拆分/分组列,如下所示:

seq X    seq1  X1   seq2 X2
1   a    1     d    1    f
2   b    2     e    2    g
3   c    NA    NA   3    h
NA  NA   NA    NA   4    i
NA  NA   NA    NA   5    j

提前谢谢你

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们需要先拆分数据框,然后应用一个自定义函数来合并不相等的数据框,即

    do.call(cbindPad, split(df, cumsum(df$seq == 1)))
    
    #  1.seq  1.X 2.seq  2.X 3.seq 3.X
    #1     1    a     1    d     1   f
    #2     2    b     2    e     2   g
    #3     3    c    NA <NA>     3   h
    #4    NA <NA>    NA <NA>     4   i
    #5    NA <NA>    NA <NA>     5   j
    

    cbindpad 被@joran 在this post 的回答中拍摄

    【讨论】:

    • 一段很棒的代码...我被困在如何split 数据上。抱歉,由于我的限制已超过,我无法对此进行投票。
    • 我在想,我们可以避免cbindPad。甚至我也在尝试那个
    • @joel.wilson 但是你将如何绑定它们呢?除非您的意思是将它们留在列表中(这不是 OP 想要的)
    • 你会检查我的步骤吗?这可行吗?
    【解决方案2】:

    这只是为了探索,@Sotos 这种东西会起作用吗? bdw 这有很多转置,效率不高

    df1 = split(df, cumsum(df$seq == 1))
    df2 = lapply(df1 , function(x) as.data.frame(t(x)))
    #$`1`
    #    V1 V2 V3
    #seq  1  2  3
    #X    a  b  c
    
    #$`2`
    #    V1 V2
    #seq  1  2
    #X    d  e
    
    #$`3`
    #    V1 V2 V3 V4 V5
    #seq  1  2  3  4  5
    #X    f  g  h  i  j
    
    data.frame(t(rbind.fill(df2)))
    #     X1   X2   X3   X4 X5 X6
    #V1    1    a    1    d  1  f
    #V2    2    b    2    e  2  g
    #V3    3    c <NA> <NA>  3  h
    #V4 <NA> <NA> <NA> <NA>  4  i
    #V5 <NA> <NA> <NA> <NA>  5  j
    

    【讨论】:

    • 当然可以。您只是在遵循我从 cbindpad 获取的帖子中的另一种方法。很多t 这让它有点沉重,但它确实触及了问题的核心
    • @Sotos 我实际上没有检查这些答案。但无论如何
    • 我的意思是您也必须遵循“fill_withNA”类型的流程
    • 太棒了!谢谢你的帮助:)
    • @user7374845 介意通过这个stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2021-01-17
    相关资源
    最近更新 更多