Создание фрейма данных
cc <- data.frame(matrix(c(1,-1,NA,-1,1,-1), nrow=2, byrow = T))
cc
X1 X2 X3
1 1 -1 NA
2 -1 1 -1
Цикл по фрейму данных, изменение значения строки на основе значения из предыдущего столбца
# Loop starts from the last column
for(i in length(colnames(cc)):1){
# Nested loop starts from first row
for(j in 1:length(rownames(cc))){
# Check if column is the first
if(i == 1){
cc[j,i] <- NA
}
# Check for NAs
else if(is.na(cc[j,i]) | is.na(cc[j,i-1])){
cc[j,i] <- NA
}
# Set to true if condition is met
else if(cc[j,i] == 1 & cc[j,i-1] == -1){
cc[j,i] <- TRUE
}
# Else set to false
else(cc[j,i] <- FALSE)
}
}
Это, очевидно, может быть дополнительно оптимизировано, но я попыталсясделайте код как можно более простым.
Результат
cc
X1 X2 X3
1 NA 0 NA
2 NA 1 0
Объяснение
Я думаю, что в вашем подходе может возникнуть логическая ошибка.Эта матрица не может быть зациклена в последовательном порядке (от столбца 1 до столбца n) и привести к разумному результату.Если вы начнете со столбца 1 и установите для него значение NA
(поскольку у него нет предыдущего столбца), вы получите
[,1] [,2] [,3]
[1,] NA -1 NA
[2,] NA 1 -1
. В следующем цикле по столбцу 2 вы неизбежно получите все NAs
какпредыдущий столбец - все NA
(а не -1) и т. д.
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA