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) ) |
我调查了有关相应方法的各种帖子,例如组中的单个组或组合 – 没有任何成功 – 这个案例没有包含在以前的帖子中。
提前谢谢你。
- 您的意思是从 Group1 和 Group2 的组合中创建 factor 吗?第 9 行的 ID=3?
- 一个数字,是的。结果不是一个因素。人们可能会考虑将”创建”一个因子值作为中间步骤。
使用 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 |
等价的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 |
- within 更短? within(DF_A, ID <- ave(c(Group_2), Group_1, FUN = c))
- @chinsoon12 – 绝对是!
您可以按 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 %>% |
来源:https://www.codenong.com/48799264/