我有这样的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)
答案 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
我们使用id
按ave
组应用您的代码。
答案 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