关于 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)
)

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

提前谢谢你。

  • 您的意思是从 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
#   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
  • 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 %>%
  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


来源:https://www.codenong.com/48799264/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9454.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?