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) ) |
我调查了有关相应方法的各种帖子,例如组中的单个组或组合 - 没有任何成功 - 这个案例没有包含在以前的帖子中。
提前谢谢你。
使用
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 |
等价的
1 2 3 4 | library(dplyr) DF_A %>% group_by(Group_1) %>% mutate(ID = match(Group_2, unique(Group_2))) |
您可以使用因子水平的整数值。我们可以简单地将
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 中的
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 |