关于 r:组内连续和唯一编号

Consecutive Across and Unique Number Within Group

我有一个数据框,如下所示:

1
2
3
4
DF_A <- data.frame(
  Group_1 = c("A","A","A","A","A","B","B","B","B","C"),
  Group_2 = c("A","B","C","A","B","A","B","A","C","A")
)

我想为 Group_1 ID 分配一个连续编号,对于相同的 Group_2 ID,该编号应该是唯一的。例如,A A 以 1 开头,A B 以 2 继续(相同的 Group_1 ID,但新的 Group_2 ID),...,A A 再次为 1(显然是重复)。 B A 为 1(新的 Group_1 ID),...,B A(相同的 Group_1 ID,但新的 Group_2 ID)...等等。

结果应该是这样的。

1
2
3
4
5
DF_B <- data.frame(
  Group_1 = c("A","A","A","A","A","B","B","B","B","C"),
  Group_2 = c("A","B","C","A","B","A","B","A","C","A"),
  ID      = c(1, 2, 3, 1, 2, 1, 2, 1, 1, 1)
)

我调查了有关相应方法的各种帖子,例如组中的单个组或组合 - 没有任何成功 - 这个案例没有包含在以前的帖子中。

提前谢谢你。


使用 ave 的一种方法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DF_A$ID <- ave(DF_A$Group_2, DF_A$Group_1, FUN = function(x) match(x, unique(x)))

DF_A
#   Group_1 Group_2 ID
#1        A       A  1
#2        A       B  2
#3        A       C  3
#4        A       A  1
#5        A       B  2
#6        B       A  1
#7        B       B  2
#8        B       A  1
#9        B       C  3
#10       C       A  1

等价的dplyr方式是:

1
2
3
4
library(dplyr)
DF_A %>%
  group_by(Group_1) %>%
  mutate(ID = match(Group_2, unique(Group_2)))


您可以使用因子水平的整数值。我们可以简单地将 Group_2 包裹在 c() 中以删除因子属性。

1
2
3
4
5
6
7
8
9
10
11
12
within(DF_A, { ID = ave(c(Group_2), Group_1, FUN = c) })
#   Group_1 Group_2 ID
# 1        A       A  1
# 2        A       B  2
# 3        A       C  3
# 4        A       A  1
# 5        A       B  2
# 6        B       A  1
# 7        B       B  2
# 8        B       A  1
# 9        B       C  3
# 10       C       A  1


您可以按 Group_1 分组,然后从每个组内的组合中创建因子,然后转换为整数

1
DF_A$ID <- unlist(by(DF_A, DF_A$Group_1, function(x) as.integer(factor(x$Group_2))))

我们可以使用 dplyr 中的 dense_rank

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
library(dplyr)

DF_A2 <- DF_A %>%
  group_by(Group_1) %>%
  mutate(ID = dense_rank(Group_2)) %>%
  ungroup()
DF_A2
# # A tibble: 10 x 3
#    Group_1 Group_2    ID
#    <fct>   <fct>   <int>
#  1 A       A           1
#  2 A       B           2
#  3 A       C           3
#  4 A       A           1
#  5 A       B           2
#  6 B       A           1
#  7 B       B           2
#  8 B       A           1
#  9 B       C           3
# 10 C       A           1