【问题标题】:unlisting and replacing empty elements as 0取消列出并将空元素替换为 0
【发布时间】:2014-12-14 06:10:51
【问题描述】:

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

我想把它转换成一个相同长度的整数向量。取消列出将删除空元素,而我打算将它们填充为 0。

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

【问题讨论】:

  • 将ifelse 与length-1 参数一起使用有点难看。这是if(){}else{} 有意义且更高效的一个实例。此外,它们都不需要==0,因为它们都会将参数强制为逻辑参数,因此0==FALSE。
  • 我同意,这样会更整洁。

标签: r


【解决方案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<-)。但是,这会为该特定元素提供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)

【讨论】:

    【解决方案2】:

    这形成了一个逻辑索引,可以使用"[&lt;-":

     z[sapply(z, length)==0 ] <- 0
     z
    #-------------
    [[1]]
    [1] 10
    
    [[2]]
    [1] 7
    
    [[3]]
    [1] 0
    
    [[4]]
    [1] 5
    
    [[5]]
    [1] 0
    

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

    【讨论】:

    • 啊抱歉,我没有明确表示我打算将原子向量作为输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多