取消列出并将空元素替换为0

时间:2014-12-14 06:10:51

标签: r

我有一个包含整数或空的元素的列表,例如z <- list(10, 7, integer(0), 5, 4)

我想将其转换为相同长度的整数向量。 Unlisting将删除空元素,而我打算将它们填充为0。

目前我所做的是sapply(z, function(x) {ifelse(length(x)==0, 0, x)})。我很好奇是否有现有的R功能或其他可以更优雅地执行此功能的方法?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用replace

unlist(replace(z, !sapply(z, length),0))
#[1] 10  7  0  5  4

或者

 sapply(Map(`c`,z,0),`[`,1)
 #[1] 10  7  0  5  4

或者

 mapply(function(x,y) c(x,y)[1], z, 0)
 #[1] 10  7  0  5  4

另一种选择是将长度分配给1length<-)。但是,这会为{1}}提供NA,而不是0,您可以根据需要进行转换。

sapply(z, `length<-`, 1)
#[1] 10  7 NA  5  4

通过

 colSums(rbind(sapply(z, `length<-`,1),0), na.rm=TRUE)
 #[1] 10  7  0  5  4

或者如果你需要它在列表中

ifelse(!sapply(z, length), 0, z)

答案 1 :(得分:1)

这形成了一个逻辑索引,可以使用"[<-"

 z[sapply(z, length)==0 ] <- 0
 z
#-------------
[[1]]
[1] 10

[[2]]
[1] 7

[[3]]
[1] 0

[[4]]
[1] 5

[[5]]
[1] 0

从技术上讲,我已满足您的要求,因为R列表符合向量要求。如果意图是提供原子向量而不是递归向量,则可能需要使用unlist