R语言 基于正向负值移位的组序列

s5a0g9ez  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个名为df的 Dataframe (如下面的dput所示):

value
1     -4
2     -3
3     -2
4     -1
5      0
6      1
7      2
8      3
9     -3
10    -2
11    -1
12     0
13     1
14     2
15     3
16    -3
17    -2
18    -1
19     0
20     1
21     2
22    -2
23    -1
24     0
25     1
26     2
27     3
28     4

我想根据正值变为负值的时间对序列列“value”进行分组,当正值变为负值时,它就是一个组。因此,第8行的值为3,第9行的值为-3,这意味着正值变为负值,因此第8行之前的所有行都是一个组。第15行和第16行也会发生移位,依此类推。下面是所需的输出:

value group
1     -4     1
2     -3     1
3     -2     1
4     -1     1
5      0     1
6      1     1
7      2     1
8      3     1
9     -3     2
10    -2     2
11    -1     2
12     0     2
13     1     2
14     2     2
15     3     2
16    -3     3
17    -2     3
18    -1     3
19     0     3
20     1     3
21     2     3
22    -2     4
23    -1     4
24     0     4
25     1     4
26     2     4
27     3     4
28     4     4

所以我想知道有没有人知道如何根据正值到负值的变化对这个序列进行分组?
df的dput

df <- structure(list(value = c(-4, -3, -2, -1, 0, 1, 2, 3, -3, -2, 
-1, 0, 1, 2, 3, -3, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, 3, 4)), class = "data.frame", row.names = c(NA, 
-28L))
njthzxwz

njthzxwz1#

编辑:更新答案以稳定输出。
我觉得你可以用

library(dplyr)

df %>% 
  group_by(grp = cumsum(coalesce(value == -lag(value, n = 1), TRUE)))

这将返回

# A tibble: 28 x 2
# Groups:   grp [4]
   value   grp
   <dbl> <int>
 1    -4     1
 2    -3     1
 3    -2     1
 4    -1     1
 5     0     1
 6     1     1
 7     2     1
 8     3     1
 9    -3     2
10    -2     2
11    -1     2
12     0     2
13     1     2
14     2     2
15     3     2
16    -3     3
17    -2     3
18    -1     3
19     0     3
20     1     3
21     2     3
22    -2     4
23    -1     4
24     0     4
25     1     4
26     2     4
27     3     4
28     4     4

我使用group_by进行分组,如果您只需要一个新列,请将其替换为mutate

相关问题