代码之家  ›  专栏  ›  技术社区  ›  Chuck C

将宽面板data.frame转换为long-from-to(源-目标)转换格式,格式为r

  •  1
  • Chuck C  · 技术社区  · 6 年前

    在示例panel data.frame中,r

    D<- data.frame(id=c(1:4),step1=c(1,1,1,1),step2=c(2,3,10,2), step3=c(3,2,NA,3),step4=c(4,10,NA,NA))
    

    看起来像

     id step1 step2 step3 step4
      1     1     2     3     4
      2     1     3     2    10
      3     1    10    NA    NA
      4     1     2     3    NA
    

    每个人都经历了4个有序的步骤,这些值是节点的名称。不意味着这个人消失了,这在我的情况下很好。 我要将此data.frame转换为长格式并显示转换信息,其中有三列:from、to、step(order),如下所示:

       id from to step
    1   1    1  2    1
    2   1    2  3    2
    3   1    3  4    3
    4   2    1  3    1
    5   2    3  2    2
    6   2    2 10    3
    7   3    1 10    1
    8   3   10 NA    2
    9   3   NA NA    3
    10  4    1  2    1
    11  4    2  3    2
    12  4    3 NA    3
    

    知道怎么做吗?谢谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   JasonAizkalns    6 年前

    这可以被清理,但希望你能明白其中的要点:

    D %>%
      gather("key", "value", -id) %>%
      arrange(id, key) %>%
      group_by(id) %>%
      mutate(
        from = value,
        to = lead(value, 1)
      ) %>%
      slice(1:(n() - 1)) %>%       # remove the last record from each group (id)
      rename(step = value) %>%
      select(id, from, to, step, key)
    
    #       id  from    to  step key  
    #    <int> <dbl> <dbl> <dbl> <chr>
    #  1     1     1     2     1 step1
    #  2     1     2     3     2 step2
    #  3     1     3     4     3 step3
    #  4     2     1     3     1 step1
    #  5     2     3     2     3 step2
    #  6     2     2    10     2 step3
    #  7     3     1    10     1 step1
    #  8     3    10    NA    10 step2
    #  9     3    NA    NA    NA step3
    # 10     4     1     2     1 step1
    # 11     4     2     3     2 step2
    # 12     4     3    NA     3 step3