沿着组创建序列,该序列根据另一列的值重新启动

时间:2018-09-29 14:40:53

标签: r

我有这样的df:

id <- c(rep(380,6),rep(381,4),rep(382,4),rep(383,5))
T_F <- c(FALSE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE)
df <- data.frame(id,T_F)

当T_F更改时,我希望的输出增加1,但是当id更改时,我也会重新开始编号:

df$result <- c(1,1,2,3,4,5,1,2,3,3,1,1,2,3,1,2,3,3,3)

使用以下代码,当T_F更改时,我的结果可以增加1:

df$result <- cumsum(c(1,diff(df$T_F) != 0))

但是,当id更改时,这不会重新开始编号。我尝试了以下各种方法,但没有成功:

ave(df$id,cumsum(c(1,diff(df$id) != 0))|cumsum(c(1,diff(df$T_F) != 0)),FUN=seq_along)

2 个答案:

答案 0 :(得分:0)

你可以

transform(df,
          result_2 = ave(T_F, id, FUN = function(x) cumsum(c(1, diff(x) != 0))))
#    id   T_F result result_2
#1  380 FALSE      1        1
#2  380 FALSE      1        1
#3  380  TRUE      2        2
#4  380 FALSE      3        3
#5  380  TRUE      4        4
#6  380 FALSE      5        5
#7  381 FALSE      1        1
#8  381  TRUE      2        2
#9  381 FALSE      3        3
#10 381 FALSE      3        3
#11 382 FALSE      1        1
#12 382 FALSE      1        1
#13 382  TRUE      2        2
#14 382 FALSE      3        3
#15 383 FALSE      1        1
#16 383  TRUE      2        2
#17 383 FALSE      3        3
#18 383 FALSE      3        3
#19 383 FALSE      3        3

我们使用idave组应用您的代码。

答案 1 :(得分:0)

另一种方法是在T_F向量上使用移位运算符来识别顺序更改:

id <- c(rep(380,6),rep(381,4),rep(382,4),rep(383,5))
T_F <-c(FALSE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE, 
FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE)
df <- data.frame(id,T_F)
df$result <- c(1,1,2,3,4,5,1,2,3,3,1,1,2,3,1,2,3,3,3)

library(binhf)
df %>% group_by(id) %>% mut(result2=cumsum(T_F!=shift(T_F,1))+1)

#          id T_F   result result2
#       <dbl> <lgl>  <dbl>   <dbl>
#     1   380 FALSE      1       1
#     2   380 FALSE      1       1
#     3   380 TRUE       2       2
#     4   380 FALSE      3       3
#     5   380 TRUE       4       4
#     6   380 FALSE      5       5
#     7   381 FALSE      1       1
#     8   381 TRUE       2       2
#     9   381 FALSE      3       3
#    10   381 FALSE      3       3
#    11   382 FALSE      1       1
#    12   382 FALSE      1       1
#    13   382 TRUE       2       2
#    14   382 FALSE      3       3
#    15   383 FALSE      1       1
#    16   383 TRUE       2       2
#    17   383 FALSE      3       3
#    18   383 FALSE      3       3
#    19   383 FALSE      3       3