代码之家  ›  专栏  ›  技术社区  ›  WayToNinja

在r中组合表中不同行的值

  •  3
  • WayToNinja  · 技术社区  · 10 年前

    我需要在R中重新格式化表格。

    我有一张这样的桌子。

    ID  category   
    1   a   
    1   b   
    2   c   
    3   d   
    4   a   
    4   c  
    5   a   
    

    我想把它改造成

    ID  category1   category2  
    1           a           b  
    2           c        null  
    3           d        null  
    4           a           c  
    5           a        null  
    

    这在R区可行吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   A5C1D2H2I1M1N2O1R2T1    10 年前

    这是一个非常简单的“长到宽”类型的重塑问题,但您需要一个次要的“id”(或“time”)变量。

    您可以尝试使用 getanID 从我的“splitstackshape”包中,并使用 dcast 从长变宽。 getanID 将创建一个名为“.id”的新列,该列将用作“time”变量:

    library(splitstackshape)
    dcast.data.table(getanID(mydf, "ID"), ID ~ .id, value.var = "category")
    #    ID 1  2
    # 1:  1 a  b
    # 2:  2 c NA
    # 3:  3 d NA
    # 4:  4 a  c
    # 5:  5 a NA
    
        2
  •  1
  •   Gregor Thomas    10 年前

    与Ananda的相同,但使用 dplyr tidyr :

    library(tidyr)
    library(dplyr)
    mydf %>% group_by(ID) %>%
        mutate(cat_row = paste0("category", 1:n())) %>%
        spread(key = cat_row, value = category)
    
    # Source: local data frame [5 x 3]
    # 
    #   ID category1  category2
    # 1  1         a          b
    # 2  2         c         NA
    # 3  3         d         NA
    # 4  4         a          c
    # 5  5         a         NA
    
    推荐文章