我有两个版本的同一嵌套列表(或列表列表)。嵌套列表中的每个列表包含不同数量的向量(向量仅包含整数)。
一些示例数据:
#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.miss
(L.full
中的原始值)中重新分配原始值,为原始数字提供“第二次机会”二项式概率p2
。要注意的是,只有嵌套列表中至少有一个整数不是NA时,它才应该有第二次机会。例如,在L.miss
中,第3个位置(即L.miss[[3]]
)不会获得此“第二次机会”,因为列表中的所有矢量都包含所有NA
值。 L.miss
中的所有其他位置将有机会重新分配原始编号,因为它们在嵌套列表中至少有一个非NA整数。
例如,如果p2 = 1,则所有NA
值都将替换为原始值,但包含所有NA
值的列表除外(当向量嵌套列表时,这种情况尤其可能很小(即n = 2)。如果p2 = 0,则不会替换任何NA
值。
我尝试利用NA
值的向量是逻辑类型,而不是数字的事实,但是我一直处于死胡同。
我写了下面的函数,该函数使用上面的示例L.miss
和L.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
,则运行“第二次机会”概率。任何建议,我们将不胜感激!
答案 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
}}}}}}}