用列表中的值按行替换 NA

replacing NA by row with value in a list

我有一个 table 看起来有点像这样:

#   item  1   2   3   4   5   6   7   8
#1    1   2   4   6   NA  NA  NA  NA  NA
#2    2   1   4   5   6   NA  NA  NA  NA
#3    3   NA  NA  NA  NA  NA  NA  NA  NA
#4    4   1   2   6   NA  NA  NA  NA  NA
#5    5   2   3   4   6   7   8   NA  NA

我有一个列表

list1<-11:13

我想用列表中的元素逐行替换 NA,结果应该是这样的:

#  item   1   2   3   4   5   6  7   8
#1    1   2   4   6  11  12  13  NA  NA
#2    2   1   4   5   6  11  12  13  NA
#3    3  11  12  13  NA  NA  NA  NA  NA
#4    4   1   2   6  11  12  13  NA  NA  
#5    5   2   3   4   6   7   8  11  12  

我试过了

for(i in 1:5){
  res<-which(is.na(Mydata[i,]))
  Mydata[i,res]<-c(list1, rep(NA, 8))
}

它似乎与示例中的 table 一起使用,但给出了许多警告消息。当我 运行 它有一个非常大的 table 时,它有时会给出错误的结果。谁能告诉我我的代码有什么问题?或者有更好的方法吗?

我们使用 applyMARGIN=1 遍历 'Mydata' 的行,为 NA ('i1') 的元素创建数字索引,检查最小长度NA 元素和 list1 ('l1') 和 replace 基于元素最少数量的元素。

t(apply(Mydata, 1, function(x) {
           i1 <- which(is.na(x))
           l1 <- min(length(i1), length(list1))
            replace(x, i1[seq(l1)], list1[seq(l1)])}))

#  item X1 X2 X3 X4 X5 X6 X7 X8
#1    1  2  4  6 11 12 13 NA NA
#2    2  1  4  5  6 11 12 13 NA
#3    3 11 12 13 NA NA NA NA NA
#4    4  1  2  6 11 12 13 NA NA
#5    5  2  3  4  6  7  8 11 12

或者正如@RichardSciven 提到的,我们可以通过遍历行

na.omitapply 一起使用
t(apply(df, 1, function(x) { 
        w <- na.omit(which(is.na(x))[1:3])
        x[w] <- list1[1:length(w)]
        x }))

您可以使用矩阵索引一次完成所有操作:

sel <- pmin(outer( 0:2, max.col(is.na(dat), "first"), `+`), ncol(dat))
dat[unique(cbind(c(col(sel)),c(sel)))] <- 11:13

#     item  1  2  3  4  5  6  7  8
#[1,]    1  2  4  6 11 12 13 NA NA
#[2,]    2  1  4  5  6 11 12 13 NA
#[3,]    3 11 12 13 NA NA NA NA NA
#[4,]    4  1  2  6 11 12 13 NA NA
#[5,]    5  2  3  4  6  7  8 11 12