【问题标题】:Replace NA in nested list if at least one of the values in the nested list is not NA如果嵌套列表中的至少一个值不是 NA,则替换嵌套列表中的 NA
【发布时间】:2019-11-21 05:48:39
【问题描述】:

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

  • 列表中包含所有数据的“完整”版本
  • “缺失”版本 - 与完整版本相同,但某些整数随机替换为 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 值的列表,并通过根据一些二项式概率 @987654324 重新分配 L.miss 中的原始值(来自 L.full 的原始值)给原始数字一个“第二次机会” @。问题是它应该有第二次机会只有在嵌套列表中至少有一个整数不是 NA 时。例如,在L.miss 中,第 3 个位置(即L.miss[[3]])不会获得这种“第二次机会”,因为列表中的所有向量都包含所有NA 值。 L.miss 中的所有其他位置将有机会重新分配原始编号,因为它们在嵌套列表中至少有一个非 NA 整数。

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

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

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

##' @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 值的嵌套列表,然后如果不是全部NAs 则运行“第二次机会”概率。非常感谢任何建议!

【问题讨论】:

    标签: r


    【解决方案1】:

    过程:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多