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

将R中数据表中的连续行分组

  •  1
  • YOLO  · 技术社区  · 7 年前

    我找不到解决这个简单问题的办法。 我有这样一个数据框:

    df = data.table(X1 = 1:12, X2 = LETTERS[1:12])
    

    我想创建一个名为 group

    预期结果:

        X1 X2 group
     1:  1  A     0
     2:  2  B     0
     3:  3  C     0
     4:  4  D     1
     5:  5  E     1
     6:  6  F     1
     7:  7  G     2
     8:  8  H     2
     9:  9  I     2
    10: 10  J     3
    11: 11  K     3
    12: 12  L     3
    
    4 回复  |  直到 7 年前
        1
  •  6
  •   Gregor Thomas    7 年前

    Mod运算符 %/%

    df[, group := (1:.N - 1) %/% 3]
    df
    #    X1 X2 group
    # 1:  1  A     0
    # 2:  2  B     0
    # 3:  3  C     0
    # 4:  4  D     1
    # 5:  5  E     1
    # 6:  6  F     1
    # 7:  7  G     2
    # 8:  8  H     2
    # 9:  9  I     2
    #10: 10  J     3
    #11: 11  K     3
    #12: 12  L     3
    
        2
  •  5
  •   markus    7 年前

    你也可以使用 rep

    df[, group := rep(1:(.N / 3) - 1, each = 3)]
    df
    #    X1 X2 group
    # 1:  1  A     0
    # 2:  2  B     0
    # 3:  3  C     0
    # 4:  4  D     1
    # 5:  5  E     1
    # 6:  6  F     1
    # 7:  7  G     2
    # 8:  8  H     2
    # 9:  9  I     2
    #10: 10  J     3
    #11: 11  K     3
    #12: 12  L     3
    
        3
  •  2
  •   Dave Rosenman    7 年前

    consecutive_groups <- function(df, group_length = 3) {
      n_groups <- if_else(nrow(df) %% group_length == 0L, 
                          nrow(df) / group_length, 
                          as.integer(nrow(df) / group_length) + 1 )
      df %>% mutate(row_number = row_number(), 
                    group = ntile(row_number, n_groups) - 1) %>% 
             select(-row_number)
    }
    
    
    
    
     consecutive_groups(df, 3)
       #     X1 X2 group
       # 1   1  A     0
       # 2   2  B     0
       # 3   3  C     0
       # 4   4  D     1
       # 5   5  E     1
       # 6   6  F     1
       # 7   7  G     2
       # 8   8  H     2
       # 9   9  I     2
       # 10 10  J     3
       # 11 11  K     3
       # 12 12  L     3
    
        4
  •  0
  •   Julian_Hn    7 年前

    对于此具有快速功能的特定情况:

       group <- function(dt,groupsize)
        {
          if(nrow(dt) %% groupsize != 0){
            print("Groupsize must be divisor of nrow!")
            return()
          }
        return(cbind(dt,data.frame(group=unlist(lapply(1:(nrow(dt) / groupsize),function(i){rep(i,groupsize)}))))))
        }