代码之家  ›  专栏  ›  技术社区  ›  5th

无硬编码的双排列

r
  •  1
  • 5th  · 技术社区  · 7 年前

    我被困在这里。我试过用 spread 两次从 tidyr ,我试着加入。但是,如果没有一些硬编码,这些方法都不能给出正确的解决方案。

    是否有任何方法可以转换此数据:

        cat1   cat2 title
    1      A      G    AB
    2      B      G    BC
    3      C      B    CD
    4      D      G    DE
    5      E      H    EF
    6      F      A    FG
    

    在这方面:

       A B C D E F G H
    AB 1 0 0 0 0 0 1 0
    BC 0 1 0 0 0 0 1 0
    CD 0 1 1 0 0 0 0 0
    DE 0 0 0 1 0 0 1 0
    EF 0 0 0 0 1 0 0 1
    FG 1 0 0 0 0 1 0 0
    

    样本数据:

    df<-data.frame(cat1=LETTERS[1:6],
                   cat2=c('G','G','B','G','H','A'),
                   title=paste0(LETTERS[1:6],LETTERS[2:7]))
    

    因为我通常 dplyr 回答更快:R基或 蒂迪尔 只有解决方案也非常受欢迎

    2 回复  |  直到 7 年前
        1
  •  4
  •   MHammer    7 年前

    我不知道这是否可以作为操作的硬编码

    df %>% 
      tidyr::gather(key = vars, value = values, cat1, cat2) %>% 
      dplyr::mutate(vars = 1) %>% 
      tidyr::spread(key = values, value = vars, fill = 0)
    #   title A B C D E F G H
    # 1    AB 1 0 0 0 0 0 1 0
    # 2    BC 0 1 0 0 0 0 1 0
    # 3    CD 0 1 1 0 0 0 0 0
    # 4    DE 0 0 0 1 0 0 1 0
    # 5    EF 0 0 0 0 1 0 0 1
    # 6    FG 1 0 0 0 0 1 0 0
    
        2
  •  2
  •   Mako212    7 年前

    只是 melt 首先,然后铸造:

    require(reshape2)
    
    melt(df, id="title") %>% dcast(title ~ value, length)
    
      title A B C D E F G H
    1    AB 1 0 0 0 0 0 1 0
    2    BC 0 1 0 0 0 0 1 0
    3    CD 0 1 1 0 0 0 0 0
    4    DE 0 0 0 1 0 0 1 0
    5    EF 0 0 0 0 1 0 0 1
    6    FG 1 0 0 0 0 1 0 0
    

    熔化