如果嵌套列表中的至少一个值不是NA

时间:2019-11-21 05:48:39

标签: r

我有两个版本的同一嵌套列表(或列表列表)。嵌套列表中的每个列表包含不同数量的向量(向量仅包含整数)。

  • “完整”版本,列表中包含所有数据
  • “缺失”版本-与完整版本相同,但是某些整数被随机替换为NA

一些示例数据:

#complete list
L.full<-list(list(1,3,c(0,2,0),c(0,0)),list(1,6,c(0,3,2,0,1,0),c(0,0,0,1,0,0),1,2,c(0,1),2,c(0,0)),
     list(1,0),list(1,0),list(1,4,c(2,0,0,0),c(4,1),c(1,0,0,0,0),0))

#"randomly" allocated NAs
L.miss<-list(list(1,3,c(0,NA,0),c(0,0)),list(1,6,c(0,3,NA,0,NA,0),c(0,NA,0,1,0,0),1,NA,c(0,1),2,c(0,0)),
             list(NA,NA),list(1,0),list(1,NA,c(NA,0,0,0),c(NA,NA),c(1,0,0,NA,0),0))

我现在想回顾一下包含NA值的列表,并根据一些建议,通过在L.missL.full中的原始值)中重新分配原始值,为原始数字提供“第二次机会”二项式概率p2。要注意的是,只有嵌套列表中至少有一个整数不是NA时,它才应该有第二次机会。例如,在L.miss中,第3个位置(即L.miss[[3]])不会获得此“第二次机会”,因为列表中的所有矢量都包含所有NA值。 L.miss中的所有其他位置将有机会重新分配原始编号,因为它们在嵌套列表中至少有一个非NA整数。

例如,如果p2 = 1,则所有NA值都将替换为原始值,但包含所有NA值的列表除外(当向量嵌套列表时,这种情况尤其可能很小(即n = 2)。如果p2 = 0,则不会替换任何NA值。

我尝试利用NA值的向量是逻辑类型,而不是数字的事实,但是我一直处于死胡同。

我写了下面的函数,该函数使用上面的示例L.missL.full,并以某种概率NA替换了所有p2值。

##' @param L.full is the complete nested list (i.e. from above)
##' @param L.miss is the imperfect nested list (i.e. from above)
##' @param p2 is the "second chance" probability

second.chance<-function(L.miss,L.full,p2){
  sec.chance<-list()
#Get down to the individual values in the nested lists (of varying lengths)
  for (i in 1:length(L.miss)){
    for (j in 1:length(L.miss[[i]])){
      for (k in 1:length(L.miss[[i]][[j]])){
        for (l in 1:length(L.miss[[i]][[j]][[k]])){
          #If the value is NA, assign the original value with some binomial probability p2
          if (is.na(L.miss[[i]][[j]][[k]])){
            sec.chance[l]<-rbinom(1,1,p2)
            if (sec.chance[l]==1){
              L.miss[[i]][[j]][[k]]<-L.full[[i]][[j]][[k]]
            } else{L.miss[[i]][[j]][[k]]<-NA}
          }
        }
      }
    }
  }
  return(L.miss)
}
#An example to test. If p2 is set to 1.0, all NA values are replaced. If set to 0.0, none are replaced
L.test<-second.chance(L.full=L.full, L.miss=L.miss, p2=0.5)

这将重新分配原始值,但不加区别。我不确定如何(或在何处)添加它的功能,以便首先评估所有NA值的嵌套列表,然后如果不是所有NA,则运行“第二次机会”概率。任何建议,我们将不胜感激!

1 个答案:

答案 0 :(得分:0)

过程:

x<-sapply(L.miss, function(x) all(is.na(unlist(x))))

创建一个逻辑向量。在逐步过程中,创建一个临时行绑定列表:

temp<-rbind(L.miss,sapply(z.pass, function(x) all(is.na(unlist(x)))))

在每个嵌套列表之后都有逻辑信息(即L.miss[[2]]的逻辑信息将在temp[[4]]中-置于循环中:

for (i in 1:length(L.miss)){
    if (temp[[i*2]]==TRUE){
        L.want[i]<-L.miss[i]
        } 
        else{ 
      for (j in 1:length(L.miss[[i]])){
        for (k in 1:length(L.miss[[i]][[j]])){
          for (l in 1:length(L.miss[[i]][[j]][[k]])){
            #See if the individual position in the nested list is an NA value
            if (is.na(L.miss[[i]][[j]][[k]])){
              if(runif(1)<p2){ #Stochastic process to determine if it should proceed
                L.want[[i]][[j]][[k]]<-L.full[[i]][[j]][[k]] #reassign original value
              }}}}}}}