R有条件的lapply?

lak*_*ksa 1 conditional r lapply dataframe

我有一个数据框,如

a = c(2,NA,3,4)
b = c(NA,3,NA,NA)
c= c(5,NA,7,9)
test = data.frame(a,b,c)

> test
   a  b  c
1  2 NA  5
2 NA  3 NA
3  3 NA  7
4  4 NA  9
Run Code Online (Sandbox Code Playgroud)

我想在test $ b中只填写NA值,测试$ a的平均值和该行的test $ c.结果应该是

   a  b    c
1  2  3.5  5
2 NA  3    NA
3  3  5    7
4  4  6.5  9
Run Code Online (Sandbox Code Playgroud)

我已经尝试了申请家庭,但没有得到任何地方.想避免for循环因为我被告知我应该尽量避免for循环.

用英语我想说,

if test$b[i] == NA, test$b[i] = (test$a[i] + test$b[i])/2
else leave test$b[i] as it is.
Run Code Online (Sandbox Code Playgroud)

我确信这种问题已被多次回答,但我找不到(或认出)类似的东西.提前致谢.

akr*_*run 5

您可以为"b"列中的"NA"元素创建逻辑行索引('indx').使用它来取代'b'中的NA值,取'b'以外的列的rowMeans.(根据@thelatemail的评论修改)

indx <- is.na(test$b)
test$b[indx] <- rowMeans(test[indx,], na.rm=TRUE)

test
#   a   b  c
#1  2 3.5  5
#2 NA 3.0 NA
#3  3 5.0  7
#4  4 6.5  9
Run Code Online (Sandbox Code Playgroud)

  • 如果`b`就是剩下的,那么无论如何它都是'NA`,它就没有效果了. (2认同)