r - Creating new columns based on a pattern -


i have large dataset has pattern similar datapattern below. need code create desiredresult dataset

library(data.table)      v1 <- rep(c(rep("a", times = 2), letters[2:5],                      rep("f", times = 2)), times = 2)   v2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)),                c(c(0.34, 0.35), 2:5, c(1.95, 2.05)) )  (datapattern <- data.table(v1, v2))  (desiredresult <- data.table(v1, v2, c(rep(c(0.24, 0.25), times = 4),                              rep(c(0.34, 0.35), times = 4)),                      c(rep(c(0.95, 1.05), times = 4),                              rep(c(1.95, 2.05), times = 4)))) 

i need create column v3 in desiredresult. pattern follows:

if v1 == "a" v3 = v2 if v1 != "a" repeat previous corresponding set of v2 values until new value of a reached new values of v2 placed in v3, etc. above repeats new values of a.

i need code create column v4 in desiredresult similar column v3 except checks if v1 == "f" , places values of f v2 v4 , repeats if v1 != "f"

i have tried:

rle(datapattern$v1 == "a" ) # run length encoding   # lengths: int [1:4] 2 6 2 6   # values : logi [1:4] true false true false 

the sequence v1 != "a" or v1 != "f" appears equal number of false minus number of true. how many times each a sequence need repeated until new a reached

many thanks

ok, here better way, think, values of v2 column depending on v1=='a'.

v1 <- rep(c(rep("a", times = 2), letters[2:5],              rep("f", times = 2)), times = 2)  v2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)),         c(c(0.34, 0.35), 2:5, c(1.95, 2.05)) )  datapattern <- data.frame(v1, v2) datapattern$v3 <- ifelse(datapattern$v1 == "a", datapattern$v2, na) datapattern$v4 <- ifelse(datapattern$v1 == "f", datapattern$v2, na) (i in 1:nrow(datapattern)){     if (datapattern$v1[i] == "a"){         tmpa <- datapattern$v3[i]     }     if (is.na(datapattern$v3[i])){         datapattern$v3[i] <- tmpa     }     if (datapattern$v1[nrow(datapattern)-(i-1)] == "f"){         tmpf <- datapattern$v4[nrow(datapattern)-(i-1)]     }     if (is.na(datapattern$v4[nrow(datapattern)-(i-1)])){         datapattern$v4[nrow(datapattern)-(i-1)] <- tmpf     } } 

output, think more correct, according stated rules, desiredoutput:

> datapattern    v1   v2   v3   v4 1   0.24 0.24 0.95 2   0.25 0.25 0.95 3   b 2.00 0.25 0.95 4   c 3.00 0.25 0.95 5   d 4.00 0.25 0.95 6   e 5.00 0.25 0.95 7   f 0.95 0.25 0.95 8   f 1.05 0.25 1.05 9   0.34 0.34 1.95 10  0.35 0.35 1.95 11  b 2.00 0.35 1.95 12  c 3.00 0.35 1.95 13  d 4.00 0.35 1.95 14  e 5.00 0.35 1.95 15  f 1.95 0.35 1.95 16  f 2.05 0.35 2.05 

Comments