# read in data
dat <- structure(list(x1 = c(2, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1),
x2 = c(2, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1),
x3 = c(1.1, 1.1, 3, 1.1, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2),
x4 = c(2.4, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.6, 2.6, 2.6, 2.6, 2.6),
x5 = c(2, 2.1, 2.2, 2.1, 2.1, 2.1, 2.2, 2.2, 2.2, 2.2, 2.2, 2.2),
x6 = c(2.1, 2.2, 2.2, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.3, 2.4),
x7 = c(1.4, 1.4, 1.4, 1.4, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5),
x8 = c(2.2, 2.2, 2.2, 2.2, 2.2, 2.2, 2.2, 2.3, 2.3, 2.3, 2.3, 2.3),
x9 = c(1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.4, 1.4, 1.4)),
.Names = c("x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"),
class = "data.frame",
row.names=c("5","10","15","20","25","30","35","40","45","50","55","60"))
# number of desired result rows
iterate = 3
# empty matrix to fill
RESULT <- matrix(NA, nrow = iterate, ncol = ncol(dat))
Цикл действительно предназначен для проверки, достигли ли мы нашей цели, а затем отслеживания того, что уже было записано в РЕЗУЛЬТАТАХ для ограничений i * 5, но потому, что строка i будет начинаться с k (итерация) мы не хотим начинать делать 3 * 5 для первой проверки, поэтому мы делаем (i == k: n), чтобы вернуться к 1 * 5.
extract <- function(dat, iterate = 3, sum.increment = 5){
dat <- as.matrix(dat)
n <- nrow(dat)
p <- ncol(dat)
RESULT <- matrix(NA, nrow = iterate, ncol = p)
for(k in 1:iterate){
x <- 1
for(i in k:n){
if(x == 1){
hit <- which(cumsum(dat[i,]) > sum.increment)[1]
} else {
hit <- which(cumsum( #
c(RESULT[k,c(1:ifelse(hit>p,p,hit))], # keep track of previous values
dat[i,-c(1:(x-1))]) # to cumulatively sum with new values
) > sum.increment * which(i == k:n))[1]
}
hit <- ifelse(is.na(hit) | hit > p, p, hit) # end of the matrix
RESULT[k,c(x:hit)] <- unlist(dat[i,c(x:hit)])
if(hit == p) break # if we're at the end of the cols, start the next iteration
x <- hit + 1
}
}
if(!is.null(colnames(dat))) colnames(RESULT) <- colnames(dat)
return(RESULT)
}
extract(dat, iterate = 3, sum.increment = 5)
Результат здесь
RESULT
# x1 x2 x3 x4 x5 x6 x7 x8 x9
#[1,] 2.0 2.0 1.1 2.5 2.1 2.2 1.4 2.2 1.3
#[2,] 2.1 2.1 1.1 2.5 2.2 2.2 1.4 2.2 1.3
#[3,] 2.1 2.1 3.0 2.5 2.1 2.3 1.5 2.2 1.3