在第一个 NA 出现后删除列表列表中的所有列表位置 (R)
Remove all lists positions in list of lists after first NA appears (R)
我有一个包含所有整数的嵌套列表(或列表列表)。一些嵌套列表具有从嵌套列表中的特定位置随机分配的 NA
个值。我需要在第一个 NA
出现后删除嵌套列表中的所有位置。
举个例子,在我下面的 5 个嵌套列表 L.miss
的示例数据中,位置 L.miss[[2]]
是一个包含九个不同长度整数向量的列表。第一个 NA
出现在位置 L.miss[[2]][[4]][3]
所以 any(is.na(L.miss[[2]][[4]]))
returns TRUE
。在我想要的输出中,位置 L.miss[[2]][4:9]
需要删除。列表 L.want
是期望的结果。
L.miss <- list(list(1,3,c(0,2,0),c(NA)),
list(1,6,c(0,3,2,0,1,0),c(0,0,NA,1,0,0),1,2,c(NA,1),2,c(0,0)),
list(1,0),
list(1,0),
list(1,4,c(2,0,0,0),c(4,1),c(1,NA,0,0,0),0),
list(1,0))
L.want <- list(list(1,3,c(0,2,0)),
list(1,6,c(0,3,2,0,1,0)),
list(1,0),
list(1,0),
list(1,4,c(2,0,0,0),c(4,1),
list(1,0))
我的尝试是遍历列表位置并分配一个 NULL
值:
try <- L.miss
for (i in 1:length(try)){
for (k in 1:length(try[[i]])){
if (any(is.na(try[[i]][[k]]))){
try[[i]][k:length(try[[i]])] <- NULL
}
}
}
但是这个 returns 错误:Error in try1[[i]][[k]] : subscript out of bounds
。
我假设这是因为它在嵌套列表的全长处启动 k
for 循环,然后删除一个元素,所以现在越界了,但我不知道有任何替代方案尽管进行了详尽的搜索,还是找到了这个解决方案。
如有任何建议,我们将不胜感激!
这里有一个方法:
out_list <- lapply(L.miss, function(x) {
inds <- sapply(x, function(x) any(is.na(x)))
if(any(inds)) x[seq_len(which.max(inds) - 1)] else x
})
out_list[[2]]
#[[1]]
#[1] 1
#[[2]]
#[1] 6
#[[3]]
#[1] 0 3 2 0 1 0
我有一个包含所有整数的嵌套列表(或列表列表)。一些嵌套列表具有从嵌套列表中的特定位置随机分配的 NA
个值。我需要在第一个 NA
出现后删除嵌套列表中的所有位置。
举个例子,在我下面的 5 个嵌套列表 L.miss
的示例数据中,位置 L.miss[[2]]
是一个包含九个不同长度整数向量的列表。第一个 NA
出现在位置 L.miss[[2]][[4]][3]
所以 any(is.na(L.miss[[2]][[4]]))
returns TRUE
。在我想要的输出中,位置 L.miss[[2]][4:9]
需要删除。列表 L.want
是期望的结果。
L.miss <- list(list(1,3,c(0,2,0),c(NA)),
list(1,6,c(0,3,2,0,1,0),c(0,0,NA,1,0,0),1,2,c(NA,1),2,c(0,0)),
list(1,0),
list(1,0),
list(1,4,c(2,0,0,0),c(4,1),c(1,NA,0,0,0),0),
list(1,0))
L.want <- list(list(1,3,c(0,2,0)),
list(1,6,c(0,3,2,0,1,0)),
list(1,0),
list(1,0),
list(1,4,c(2,0,0,0),c(4,1),
list(1,0))
我的尝试是遍历列表位置并分配一个 NULL
值:
try <- L.miss
for (i in 1:length(try)){
for (k in 1:length(try[[i]])){
if (any(is.na(try[[i]][[k]]))){
try[[i]][k:length(try[[i]])] <- NULL
}
}
}
但是这个 returns 错误:Error in try1[[i]][[k]] : subscript out of bounds
。
我假设这是因为它在嵌套列表的全长处启动 k
for 循环,然后删除一个元素,所以现在越界了,但我不知道有任何替代方案尽管进行了详尽的搜索,还是找到了这个解决方案。
如有任何建议,我们将不胜感激!
这里有一个方法:
out_list <- lapply(L.miss, function(x) {
inds <- sapply(x, function(x) any(is.na(x)))
if(any(inds)) x[seq_len(which.max(inds) - 1)] else x
})
out_list[[2]]
#[[1]]
#[1] 1
#[[2]]
#[1] 6
#[[3]]
#[1] 0 3 2 0 1 0