添加重复序列的分组指示符

时间:2017-11-23 12:06:38

标签: r dplyr tidyverse

我认为这很简单,但失败了,无法从任何地方找到答案。

示例数据如下所示。我从1:x运行nro并在随机点重新启动。我想创建一个ind变量,第一次运行为1,第二次运行为2 ......

tbl <- tibble(nro = c(rep(1:3, 1), rep(1:5, 1), rep(1:4, 1)))

最终结果应如下所示:

tibble(nro = c(rep(1:3, 1), rep(1:5, 1), rep(1:4, 1)),
       ind = c(rep(1, 3), rep(2, 5), rep(3, 4)))

 # A tibble: 12 x 2
     nro   ind
   <int> <dbl>
 1     1     1
 2     2     1
 3     3     1
 4     1     2
 5     2     2
 6     3     2
 7     4     2
 8     5     2
 9     1     3
10     2     3
11     3     3
12     4     3

我以为我可以用ifelse做点什么,但却失败了。

tbl %>%
  mutate(ind = ifelse(nro < lag(nro), 1 + lag(ind), 1))

我认为这需要某种循环。

1 个答案:

答案 0 :(得分:4)

用于相同长度的序列

您可以在group_by变量上使用nro,然后点击row_number()

tbl %>% 
  group_by(nro) %>% 
  mutate(ind = row_number())

# A tibble: 12 x 2
# Groups:   nro [4]
#      nro   ind
#    <int> <int>
#  1     1     1
#  2     2     1
#  3     3     1
#  4     4     1
#  5     1     2
#  6     2     2
#  7     3     2
#  8     4     2
#  9     1     3
# 10     2     3
# 11     3     3
# 12     4     3

用于不同长度的序列

docendo discimus评论启发

tbl <- tibble(nro = c(rep(1:3, 1), rep(1:5, 1), rep(1:4, 1)))

tbl %>% 
  mutate(ind = cumsum(nro == 1))

但是,这仅限于以1开头的序列,因为只累计TRUE的{​​{1}}值。

因此,你应该考虑使用它:

nro == 1