Итак, в коде есть несколько проблем:
- Вы пытаетесь оценить temp [i + 1], когда он еще не создан, но это приведет к NA.
- Поскольку вы индексируете, используя i, после того как вы освободите temp в середине l oop, когда он встретит ноль, он не добавит значение к началу temp, вместо этого он добавит в середину.
- При зацикливании вы зацикливаетесь на
1:length(x)-1
, что приводит к 0-8, вместо этого вы хотите сделать это 1:(length(x) - 1)
Вот исправление кода;
# Creating data
x <- c(0, 0, -1, 5, 0, 0, -4, -9, 0)
# Create temp place holders
temp = c()
minV = c()
# Loop on x vector
for (i in 1:(length(x)-1)){
# If x[i] is not zero
if(x[i] != 0){
# Append to temp
temp <- c(temp, x[i])
# If next value is zero then get minimum
if(x[i+1] == 0){
# Get minimum
minV <- c(minV, min(temp))
# Free temp
temp <- c()
}
}
}
minV
# -1 -9
Однако лучший способ - вырезать вектор всякий раз, когда он встречает ноль, а затем получать минимум каждого из разбиений следующим образом:
# Creating data
x <- c(0, 0, -1, 5, 0, 0, -4, -9, 0)
# Split string at occurances of zeros
ll <- with(rle(x == 0),{
ifelse(x == 0 & (seq_along(x) != cumsum(lengths)[lengths <= 3 & values]), NA, x)
})
x_split <- split(x, with(rle(is.na(ll)), rep(1:length(lengths), lengths) + ll * 0))
# Get minimum of each vector as list of minimum(s)
lapply(x_split, min)
# $`2`
# [1] -1
#
# $`4`
# [1] -9
# Or get it in form of vector
unlist(lapply(x_split, min), use.names = FALSE)
# [1] -1 -9
# Or use sapply automatically [credit to Ben Bolker]
sapply(x_split, min)
# [1] -1 -9