Похоже, ваш код выполняет много вычислений и выделяет память каждый раз, когда он зацикливается.Чтобы уменьшить время, мы хотим уменьшить объем работы, выполняемой циклом на каждой итерации.
Я не на 100% уверен в вашей проблеме, но я думаю, что понял ее суть.Звучит так, будто вы просто хотите взять последнее не-значение NA и скопировать его в строку со значением NA.Мы можем использовать пару или индексы, чтобы сделать это.
В следующем методе вся память уже предварительно выделена, прежде чем я войду в цикл.Единственное действие памяти - заменить значение (NA) другим значением.Кроме этой операции есть проверка, чтобы видеть, является ли значение NA, и есть операция добавления в индексе.Чтобы значительно быстрее справиться с этой проблемой, вам необходимо использовать c-оптимизированные векторные функции (возможно, из пакета / библиотеки).
Чтобы использовать предыдущее значение для заполнения NA:
# Fill with previous non-NA value
VERINDEX_VEC <- c(NA,"A1","A2",NA,NA,"A3",NA)
VERINDEX_VEC
# [1] NA "A1" "A2" NA NA "A3" NA
non_na_positions <- which(!is.na(VERINDEX_VEC))
# If the first value is NA we need to fill with NA until we hit a known value...
if(is.na(VERINDEX_VEC[1])){
non_na_positions <- c(NA,non_na_positions)
}
index = 1
for(i in 1:length(VERINDEX_VEC)){
if(is.na(VERINDEX_VEC[i])) {
VERINDEX_VEC[i] <- VERINDEX_VEC[non_na_positions[index]]
} else {
index <- index + 1
}
}
VERINDEX_VEC
# [1] NA "A1" "A2" "A2" "A2" "A3" "A3"
Чтобы использовать следующее значение для заполнения NA:
# Fill with next non-NA Value
VERINDEX_VEC <- c(NA,"A1","A2",NA,NA,"A3",NA)
VERINDEX_VEC
# [1] NA "A1" "A2" NA NA "A3" NA
non_na_positions <- which(!is.na(VERINDEX_VEC))
# Never need the first position of the vector if we are looking-ahead...
index <- ifelse(non_na_positions[1]==1,2,1)
for(i in 1:length(VERINDEX_VEC)){
if(is.na(VERINDEX_VEC[i])) {
VERINDEX_VEC[i] <- VERINDEX_VEC[non_na_positions[index]]
} else {
index <- index + 1
}
}
VERINDEX_VEC
# [1] "A1" "A1" "A2" "A3" "A3" "A3" NA