如何在lapply中忽略NA?

6
set.seed(123)
B = matrix(  c(5, 3, 3, 1, 5, 1,3,1,NA,NA),   nrow=5,  ncol=2)
m1<-matrix(nrow=5,ncol=2,data=runif(10))
m2<-matrix(nrow=5,ncol=2,data=runif(10))
m2[1,2]=NA; ml <- list(m1, m2)
ind <- sapply(unique(c(B)), function(x) which(B == x, arr.ind = TRUE))
re <- lapply(ind, function(x) lapply(ml, function(y) y[x]))
res=lapply(re, function(x) c(t(do.call(cbind, x))))

但我不知道哪个对应哪个。例如:res [[1]]表示B中的5、3或1?有没有一种方法可以根据B中的对应类(数字)命名t的输出列?


你能用语言解释一下你想要做什么吗?基于这个输入,你期望的理想输出是什么样子的? - Heroka
我的第一反应是使用na.rm=TRUE...但我不完全确定你的目的。 - DarrenRhodes
如果目的是删除NA值,您可以在代码的最后一行使用na.omit - akrun
我指的是 lapply(re, function(x) na.omit(c(t(... - akrun
1
你可以使用!is.nacomplete.cases,而不是那个。 - akrun
1个回答

5
我们可以使用complete.cases
 lapply(re, function(x) {
         v1 <- c(t(do.call(cbind, x)))
         v1[complete.cases(v1)]})

1
如果您使用了unique(c(B)) [1] 5 3 1 NA,它通常会按照观察到的顺序进行。因此,在这种情况下,5将是res[[1]]3res[[2]]等等... - akrun
1
@bicton 你可以将 res 的名称设置为 res <- setNames(res, unique(c(B))) - akrun
1
@bicton 在设置名称后,您可以循环遍历 res 的名称,即 lapply(names(res), function(nm) write.table(res[[nm]], paste0('myfile', nm, '.txt'))).(抱歉,之前没有看到消息) - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接