【发布时间】: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.miss 和 L.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