R语言 如果行中的数字更改,则增加值

2mbi3lxu  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(109)

我尝试使用mutate()来增加列中的值,如果另一行中的值发生变化,并且如果第三行中的值发生变化,则重置为1,如以下示例所示:

col1 col2 count
0    1    1 
0    1    1
0    2    2
0    3    3
1    4    1
1    5    2
1    5    2

row1中更改的部分工作得很好,但在row2中更改值的第二部分工作不起作用。我只得到以下结果:

col1 col2 count
0    1    1 
0    1    2
0    2    3
0    3    4
1    4    1
1    5    2
1    5    3

这是我的工作代码:

df1 <- df %>%
  group_by(col1, col2)%>%
  mutate(counter=row_number())%>%
  ungroup

我已经试过了:

df1 <- df %>%
  group_by(col1)%>%
  mutate(counter=row_number())%>%
  group_by(col2)%>%
  mutate(counter= 'failed_code')%>%
  ungroup

但是使用像if_elsecase_when这样的函数并不适用于我给出的参数。如何为col2实现counter,仅在行更改时才会增加,如果col1更改,则重置为1

tkqqtvp1

tkqqtvp11#

使用consecutive_id(随dplyr >= 1.1.0引入),您可以执行以下操作:

library(dplyr, warn=FALSE)

dat <- data.frame(
  col1 = c(0, 0, 0, 0, 1, 1, 1),
  col2 = c(1, 1, 2, 3, 4, 5, 5)
) 

dat |> 
  mutate(count = consecutive_id(col2), .by = col1)
#>   col1 col2 count
#> 1    0    1     1
#> 2    0    1     1
#> 3    0    2     2
#> 4    0    3     3
#> 5    1    4     1
#> 6    1    5     2
#> 7    1    5     2
huwehgph

huwehgph2#

使用data.table,您可以使用rleid

df <- structure(list(col1 = c(0L, 0L, 0L, 0L, 1L, 1L, 1L), col2 = c(1L, 
1L, 2L, 3L, 4L, 5L, 5L)), class = "data.frame", row.names = c(NA, 
-7L))
require(data.table)
setDT(df)
df[,count:=rleid(col2), by = col1]
df
#   col1 col2 count
#1:    0    1     1
#2:    0    1     1
#3:    0    2     2
#4:    0    3     3
#5:    1    4     1
#6:    1    5     2
#7:    1    5     2

相关问题