首页 > 解决方案 > 从函数 R 中的列表列表中删除 NA

问题描述

我有一个函数,它将整数的嵌套列表(或列表列表)作为输入,并根据某个概率 p1 随机分配 NA 的值。我想扩展此功能以从列表中删除 NA。

我知道删除 NA 是互联网上的一个常见问题,并且已经查看了 Stack Overflow 和其他地方的问题,但没有一个解决方案有效。一般而言,提出的问题并不涉及实际的列表列表。

我努力了:

#Example data
d<-list(1,3,c(0,NA,0),c(0,0))
e<-list(1,6,c(0,3,NA,0,NA,0),c(0,NA,0,1,0,0),1,NA,c(0,0))
f<-list(1,0)
L.miss<-list(d,e,f)

#Tests
test1<-lapply(L.miss,function(x) x[!is.na(x)]) #Doesnt work
test2<-lapply(L.miss,Filter,f=Negate(is.na)) #Doesnt work
test3<-lapply(L.miss,na.omit) #Doesnt work

下面是我用来分配 NA 值的函数(另外,如果它笨重,请不要笑,我可能不像你那样有编码经验!)。我还添加了代码,该代码将生成长度为 3 的列表的示例列表,其中嵌套了各种长度的列表,类似于我的实际数据输入(尽管长度为 2000)。

imperfect.passive<-function(z,p1){
  z.imp<-z
  obs.surv<-integer()
  for (i in 1:length(z)){
    for (j in 1:length(z[[i]])){
      for (k in 1:length(z[[i]][[j]])){
        for (l in 1:length(z[[i]][[j]][[k]])){
        obs.surv[l]<-rbinom(1,1,p1)
        if (obs.surv[l]==0){
          z.imp[[i]][[j]][[k]]<-NA
          }
        }
          #######################################
          ##'@TODO -> Remove NA values from list
          #######################################
        }
        } 
  }
  return(z.imp)
}
#####for small example 
a<-list(1,3,c(0,2,0),c(0,0))
b<-list(1,6,c(0,3,2,0,1,0),c(0,0,0,1,0,0),1,2,c(0,0))
c<-list(1,0)
L.full<-list(a,b,c)

#assign NA with p=0.5
example<-imperfect.passive(L.full,0.5)

任何建议都将不胜感激,如果在其他地方得到解答,我深表歉意 - 我找不到它。

标签: r

解决方案


使用rapply

rapply(L.miss, na.omit, how = "replace")

推荐阅读