使用列中的值替换NA的行

时间:2015-10-06 06:06:29

标签: r replace na

我有一张看起来像这样的表:

#   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

我想用行中的元素替换NAs,结果应该是这样的:

#  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))
}

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

2 个答案:

答案 0 :(得分:3)

我们使用带有apply的{​​{1}}遍历'Mydata'行,为NA('i1')元素创建数字索引,检查NA元素的最小长度和list1('l1')和MARGIN=1基于最小元素数的元素。

replace

或者@RichardSciven提到,我们可以通过循环遍历行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 {/ 1}}

na.omit

答案 1 :(得分:3)

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

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