У меня есть матрица, в которой строки могут иметь NA для всех столбцов. Я хочу заменить эти строки NA значением предыдущей строки, отличным от NA, и столбцом K-th.
Например, эта матрица:
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] 1 2
[4,] 2 3
[5,] NA NA
[6,] NA NA
[7,] NA NA
[8,] 6 7
[9,] 7 8
[10,] 8 9
Должны быть преобразованы в эту не-NA матрицу, где мы используем 2-й столбец для замены:
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] 1 2
[4,] 2 3
[5,] 3 3
[6,] 3 3
[7,] 3 3
[8,] 6 7
[9,] 7 8
[10,] 8 9
Я написал для этого функцию, но используя цикл:
# replaces rows which contains all NAs with non-NA values from previous row and K-th column
na.replace <- function(x, k) {
cols <- ncol(x)
for (i in 2:nrow(x)) {
if (sum(is.na(x[i - 1, ])) == 0 && sum(is.na(x[i, ])) == cols) {
x[i, ] <- x[i - 1 , k]
}
}
x
}
Кажется, эта функция работает правильно, но я хочу избежать этих циклов. Может ли кто-нибудь посоветовать, как я могу сделать эту замену без использования циклов?
ОБНОВЛЕНИЕ
agstudy предложил собственное векторизованное решение без цикла:
na.replace <- function(mat, k){
idx <- which(rowSums(is.na(mat)) == ncol(mat))
mat[idx,] <- mat[ifelse(idx > 1, idx-1, 1), k]
mat
}
Но это решение возвращает разные и неправильные результаты по сравнению с моим решением с циклами. Почему это происходит? Теоретически петлевые и непетлевые решения идентичны.