我找不到解决这个简单问题的办法。我有这样一个数据框架:
df = data.table(X1 = 1:12, X2 = LETTERS[1:12])我想要创建一个名为group的新变量,其中我希望将连续的行按3分组,例如:第1-3行将是group0,第4-6行将是group2等等。
预期结果:
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发布于 2018-12-19 19:16:24
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发布于 2018-12-19 19:08:17
您也可以使用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发布于 2018-12-19 19:14:06
这是一种方法。
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 3https://stackoverflow.com/questions/53857580
复制相似问题