代码之家  ›  专栏  ›  技术社区  ›  Rana Usman

在R中按组将上一行添加到相应的列

r
  •  0
  • Rana Usman  · 技术社区  · 7 年前

    我将发布一个可复制的示例。

    id <- c(1,1,1,1,2,2,1,1)
    group <- c("a","b","c","d","a","b","c","d")
    df <- data.frame(id, group)
    

    我想要这样的结果。

    +====+========+========+
    | id | group1 | group2 |
    +====+========+========+
    |  1 | a      | b      |
    +----+--------+--------+
    |  1 | b      | c      |
    +----+--------+--------+
    |  1 | c      | d      |
    +----+--------+--------+
    |  1 | d      | -      |
    +----+--------+--------+
    |  2 | a      | b      |
    +----+--------+--------+
    |  2 | b      | -      |
    +----+--------+--------+
    |  1 | c      | d      |
    +----+--------+--------+
    |  1 | d      | -      |
    +----+--------+--------+
    

    我只想提一下身份证问题的顺序。我有另一列作为时间戳。

    2 回复  |  直到 7 年前
        1
  •  2
  •   tyluRp    7 年前

    一个解决方案 dplyr rleid 从…起 data.table :

    library(dplyr)
    
    df %>% 
      mutate(id2 = data.table::rleid(id)) %>% 
      group_by(id2) %>% 
      mutate(group2 = lead(group))
    
    # A tibble: 8 x 4
    # Groups:   id2 [3]
         id group   id2 group2
      <dbl> <fct> <int> <fct> 
    1  1.00 a         1 b     
    2  1.00 b         1 c     
    3  1.00 c         1 d     
    4  1.00 d         1 NA    
    5  2.00 a         2 b     
    6  2.00 b         2 NA    
    7  1.00 c         3 d     
    8  1.00 d         3 NA    
    
        2
  •  1
  •   Bruno Vilela    7 年前

    如果我理解并更正您的问题,您可以使用以下功能:

    id <- c(1,1,1,1,2,2,1,1)
    group <- c("a","b","c","d","a","b","c","d")
    df <- data.frame(id, group)
    
    add_group2 <- function(df) {
      n <-length(group)
      group2 <- as.character(df$group[2:n])
      group2 <- c(group2, "-")
      group2[which(c(df$id[-n] - c(df$id[2:n]), 0) != 0)] <- "-"
      return(data.frame(df, group2))
    }
    add_group2(df)
    

    结果应为:

     id group group2
    1  1     a      b
    2  1     b      c
    3  1     c      d
    4  1     d      -
    5  2     a      b
    6  2     b      -
    7  1     c      d
    8  1     d      -