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 withrle
和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"
i1library(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"