【发布时间】:2014-05-09 20:53:58
【问题描述】:
我有一个矩阵,其中行的所有列都可以有 NA。我想用前一行的非 NA 值和第 K 列替换这些 NA 行。
例如这个矩阵:
[,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
}
但与我的循环解决方案相比,此解决方案返回不同且错误的结果。为什么会发生这种情况?理论上循环和非循环的解决方案是相同的。
【问题讨论】: