R 如何基于上一列中状态的更改创建id列

R 如何基于上一列中状态的更改创建id列,r,dataframe,R,Dataframe,我有一个类似于此示例的数据帧 df<- structure(data.frame(ref<-c(rep (10047,11),rep(10050,9)),state<-c(0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1)),.Names=c("ref", "state")) df[5:16,] ref state 10047 0 10047 1 10047 0 10047 1 10

我有一个类似于此示例的数据帧

df<- structure(data.frame(ref<-c(rep (10047,11),rep(10050,9)),state<-c(0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1)),.Names=c("ref", "state")) 

df[5:16,]
   ref   state
  10047     0
  10047     1
  10047     0
  10047     1
  10047     1
  10047     1
  10047     0
  10050     1
  10050     1
  10050     1
  10050     1
  10050     0 

df使用
base R
可以使用try with
rle
ave
为每个
ref
创建序列,然后使用
ifelse
paste
获得预期输出

 i1 <- with(df, ave(state==1, ref, FUN= function(x) inverse.rle(within.list(rle(x), values[values] <- seq_along(values[values])))))
 ifelse(i1!=0, paste(df$ref, sprintf("%03d", i1), sep="_"), i1)
 #[1] "0"         "0"         "10047_001" "10047_001" "0"         "10047_002" "0"         "10047_003" "10047_003" "10047_003" "0"         "10050_001" "10050_001"
 #[14] "10050_001" "10050_001" "0"         "0"         "10050_002" "0"         "10050_003"
i1
library(data.table);setDT(df);df[,rid:=rleid(state),][state==1,id:=paste(ref,rleid(rid),sep=“”),][,rid:=NULL,]
 i1 <- with(df, ave(state==1, ref, FUN= function(x) inverse.rle(within.list(rle(x), values[values] <- seq_along(values[values])))))
 ifelse(i1!=0, paste(df$ref, sprintf("%03d", i1), sep="_"), i1)
 #[1] "0"         "0"         "10047_001" "10047_001" "0"         "10047_002" "0"         "10047_003" "10047_003" "10047_003" "0"         "10050_001" "10050_001"
 #[14] "10050_001" "10050_001" "0"         "0"         "10050_002" "0"         "10050_003"