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

将R中数据表中的连续行分组,r,data.table,R,Data.table,我找不到解决这个简单问题的办法。 我有这样一个数据框: df = data.table(X1 = 1:12, X2 = LETTERS[1:12]) 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

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

df = data.table(X1 = 1:12, X2 = LETTERS[1:12])
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
我想创建一个名为
group
的新变量,将连续行按3分组。例如:行1-3将是组0,行4-6将是组2,依此类推

预期结果:

    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

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

   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)}))))))
    }

组对于此具有快速功能的特定病例:

   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)}))))))
    }

group您也可以使用
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

您也可以使用
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

这里有一个方法

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
连续_组%
选择(-row\U编号)
}
连续组(df,3)
#x1x2群
#11A0
#2B0
#3C0
#4d1
#5 E 1
#6f1
#7 G 2
#8小时2
#9我2
#10 J 3
#11 K 3
#12升3

这里是一种方法

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
连续_组%
选择(-row\U编号)
}
连续组(df,3)
#x1x2群
#11A0
#2B0
#3C0
#4d1
#5 E 1
#6f1
#7 G 2
#8小时2
#9我2
#10 J 3
#11 K 3
#12升3

Mod operator
%/%
是一种简单的方法,可以执行以下操作:

df = data.table(X1 = 1:12, X2 = LETTERS[1:12])
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

Mod operator
%/%
是执行以下操作的简单方法:

df = data.table(X1 = 1:12, X2 = LETTERS[1:12])
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

我对data.table不太熟悉,但这很有效:
df$groupTranslating to data.table:
df[,group:=(1.N-1)%/%3]
@Gregor perfect,你可能想用这个来制定一个答案。我对data.table不太熟悉,但这很有效:
df$groupTranslating to data.table:
df[,group:=(1.N-1)%/%3]
@Gregor perfect,你可能想用这个来制定一个答案。
lappy
只会增加效率和复杂性
unlist(lapply(1:(nrow(dt)/groupsize),function(i){rep(i,groupsize)})
是一个很长的编写过程
rep(1:(nrow(dt)/groupsize),each=groupsize)
。我不知道rep中的此选项,非常感谢。lapply的
lapply
只是增加了低效率和复杂性
unlist(lapply(1:(nrow(dt)/groupsize),function(i){rep(i,groupsize)})
是一个很长的编写过程
rep(1:(nrow(dt)/groupsize),each=groupsize)
。在rep中不知道此选项,非常感谢。