我有一个包含整数或空的元素的列表,例如z <- list(10, 7, integer(0), 5, 4)
。
我想将其转换为相同长度的整数向量。 Unlisting将删除空元素,而我打算将它们填充为0。
目前我所做的是sapply(z, function(x) {ifelse(length(x)==0, 0, x)})
。我很好奇是否有现有的R功能或其他可以更优雅地执行此功能的方法?
答案 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
另一种选择是将长度分配给1
(length<-
)。但是,这会为{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
。