R:将dplyr组标签添加为数字

R:将dplyr组标签添加为数字,r,dplyr,grouping,R,Dplyr,Grouping,我无法理解这一定是一项简单的任务。如何将组标签获取为连续数字 library(dplyr) set.seed(1) df <- data.frame(id = sample(c('a','b'), 20, T), name = sample(c('N1', 'N2', 'N3'), 20, T), val = runif(20)) %>% group_by(id) %>% arrange(id, na

我无法理解这一定是一项简单的任务。如何将组标签获取为连续数字

library(dplyr)
set.seed(1)
df <- data.frame(id = sample(c('a','b'), 20, T),
                 name = sample(c('N1', 'N2', 'N3'), 20, T),
                 val = runif(20)) %>%
  group_by(id) %>% 
  arrange(id, name)
请注意,
name
的值可以是任何值,并且肯定不会像示例中那样以数字作为后缀(否则我可以执行
sub(“^N”,”,df$name)

我正在寻找一些不同于
1:n()
解决方案的东西,例如。

我们可以这样做

df %>%
   group_by(id) %>%
   mutate(group_no = cumsum(c(TRUE, name[-1] != name[-n()])))

或与
匹配

df %>% 
  group_by(id) %>%
  mutate(group_no = match(name, unique(name)))
# A tibble: 20 x 4
# Groups:   id [2]
#   id    name     val group_no
#   <fct> <fct>  <dbl>    <int>
# 1 a     N1    0.647         1
# 2 a     N1    0.530         1
# 3 a     N1    0.245         1
# 4 a     N2    0.693         2
# 5 a     N2    0.478         2
# 6 a     N2    0.861         2
# 7 a     N3    0.821         3
# 8 a     N3    0.0995        3
# 9 a     N3    0.662         3
#10 b     N1    0.553         1
#11 b     N1    0.0233        1
#12 b     N1    0.519         1
#13 b     N2    0.783         2
#14 b     N2    0.789         2
#15 b     N2    0.477         2
#16 b     N2    0.438         2
#17 b     N2    0.407         2
#18 b     N3    0.732         3
#19 b     N3    0.0707        3
#20 b     N3    0.316         3
df%>%
分组依据(id)%>%
变异(组号=匹配(名称,唯一(名称)))
#一个tibble:20x4
#组别:id[2]
#id名称val组\u编号
#          
#1 a N1 0.647 1
#2 a N1 0.530 1
#3 a N1 0.245 1
#4 a N2 0.693 2
#5 a N2 0.478 2
#6 a N2 0.861 2
#7 a N3 0.821 3
#8 a N3 0.0995 3
#9 a N3 0.662 3
#10 b N1 0.553 1
#11 b N1 0.0233 1
#12 b N1 0.519 1
#13 b N2 0.783 2
#14 b N2 0.789 2
#15 b N2 0.477 2
#16 b N2 0.438 2
#17 b N2 0.407 2
#18 b N3 0.732 3
#19 b N3 0.0707 3
#20 b N3 0.316 3

在这种情况下,我认为应该做一些简单的事情:

df %>%
  mutate(group_no = as.integer(name))
行得通

# A tibble: 20 x 4
# Groups:   id [2]
   id    name     val group_no
   <fct> <fct>  <dbl>    <int>
 1 a     N1    0.647         1
 2 a     N1    0.530         1
 3 a     N1    0.245         1
 4 a     N2    0.693         2
 5 a     N2    0.478         2
 6 a     N2    0.861         2
 7 a     N3    0.821         3
 8 a     N3    0.0995        3
 9 a     N3    0.662         3
10 b     N1    0.553         1
11 b     N1    0.0233        1
12 b     N1    0.519         1
13 b     N2    0.783         2
14 b     N2    0.789         2
15 b     N2    0.477         2
16 b     N2    0.438         2
17 b     N2    0.407         2
18 b     N3    0.732         3
19 b     N3    0.0707        3
20 b     N3    0.316         3
#一个tible:20x4
#组别:id[2]
id名称val组\u编号
1 a N1 0.647 1
2 a N1 0.530 1
3 a N1 0.245 1
4 a N2 0.693 2
5 a N2 0.478 2
6 a N2 0.861 2
7 a N3 0.821 3
8 a N3 0.0995 3
9 a N3 0.662 3
10 b N1 0.553 1
11 b N1 0.0233 1
12 b N1 0.519 1
13 b N2 0.783 2
14 b N2 0.789 2
15 b N2 0.477 2
16 b N2 0.438 2
17 b N2 0.407 2
18 b N3 0.732 3
19 b N3 0.0707 3
20 b N3 0.316 3

这是一个使用
左键连接的解决方案

df %>%
  left_join(df %>%
  group_by(id, name) %>%
  summarise(group_no = row_number()))

这是一个非常好的技巧!谢谢!这实际上是我经常犯的错误:)很好-但只适用于因子(如我的示例中所示)。我倾向于不想要任何因素。@user3375672确实如此。但是你可以做
mutate(group_no=as.integer(as.factor(name)))
在这种情况下,它仍然可以工作-这是很好的一点。我会接受这个简单的建议,尽管其他建议也很好。
组索引(df,name)
,但不幸的是……你在帖子中找到了一些解决方法。
df %>%
  left_join(df %>%
  group_by(id, name) %>%
  summarise(group_no = row_number()))