我有以下数据框架:
id
A
A
A
A
A
B
B
B
B
B
B
C
C
我想创建另一个列名为"Group.3"在这一列中,每组的行数以3为单位计算。连续的3行被分配相同的组号,接下来的3行或更少的行(取决于我们是否到达组的末尾)被分配另一个更高的编号。
这是我想要的列的样子:
id Group.3
A 1
A 1
A 1
A 2
A 2
B 1
B 1
B 1
B 2
B 2
B 2
C 1
C 1
关于如何做到这一点,最好使用包dplyr中的函数group_by和mutate有什么建议吗?
使用group_by和mutate与dplyr,我们可以通过查找每个组中的行号,然后使用模将行号分组为3组来实现这一点:
library(dplyr)
df <- data.frame("id"=c(rep("A",5), rep("B", 6), rep("C",2))
> df %>% group_by(id) %>% mutate(Group.3 = (row_number()-1)%/%3+1)
# A tibble: 13 × 2
# Groups: id [3]
id Group.3
<chr> <dbl>
1 A 1
2 A 1
3 A 1
4 A 2
5 A 2
6 B 1
7 B 1
8 B 1
9 B 2
10 B 2
11 B 2
12 C 1
13 C 1
顺便说一下,发布一个可重复的例子会很有帮助,这样社区就可以快速加载你的数据并开始回答你的问题。
另一种选择是使用gl
:
library(dplyr)
df %>%
group_by(id) %>%
mutate(Group.3 = as.integer(gl(n(), 3, n())))
id Group.3
<chr> <int>
1 A 1
2 A 1
3 A 1
4 A 2
5 A 2
6 B 1
7 B 1
8 B 1
9 B 2
10 B 2
11 B 2
12 C 1
13 C 1