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

use*_*672 2 grouping r dplyr

我无法解决这个必须完成的任务。如何获得作为连续数字的组标签。

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)
Run Code Online (Sandbox Code Playgroud)

我想要的是一个标签group_no,指示name每个iddplyr组中变量的类别数量。我在dplyr软件包本身中找不到解决方案。像这样:

# 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
Run Code Online (Sandbox Code Playgroud)

请注意,的值name可以是任何值,并且通常不像示例中那样带有数字后缀(否则,我可以这样做)sub("^N", "", df$name)

我要寻找的东西比稍有不同 1:n()的SO职位的解决方案,如在这里

akr*_*run 5

我们可以做的

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

或者与match

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
Run Code Online (Sandbox Code Playgroud)


den*_*nis 5

我认为在这种情况下,事情很简单:

df %>%
  mutate(group_no = as.integer(name))
Run Code Online (Sandbox Code Playgroud)

将工作

# 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
Run Code Online (Sandbox Code Playgroud)