【问题标题】:Replace empty element in a list using sapply使用 sapply 替换列表中的空元素
【发布时间】:2017-04-01 13:40:48
【问题描述】:

我有两个列表。第一个有一个空元素。我想用另一个列表的第三个列表元素的第一个向量替换那个空元素。

l1 <- list(a=1:3,b=4:9,c="")
l2 <- list(aa=11:13,bb=14:19,cc=data.frame(matrix(100:103,ncol=2)))

l1[sapply(l1, `[[`, 1)==""] <- l2[[3]][[1]]

使用sapply,我可以识别哪些元素是空的。但是,当我尝试将向量分配给这个空元素时:我收到以下错误消息:

警告信息:在 l1[sapply(l1, [[, 1) == ""] 要替换的项目数不是替换长度的倍数

这只是一个警告,但我得到的结果不是我想要的。这是我得到的 l1:

> l1
$a
[1] 1 2 3

$b
[1] 4 5 6 7 8 9

$c
[1] 100

这就是我需要的($c 中有两个元素):

> l1
$a
[1] 1 2 3

$b
[1] 4 5 6 7 8 9

$c
[1] 100 101

【问题讨论】:

    标签: r lapply sapply


    【解决方案1】:

    只需在右侧使用l2[[3]][1](单个[ 而不是[[)

    【讨论】:

    • 此示例为真。但是,如果 rhs 还不是一个列表(例如 1:5),则需要将其合并为一个。
    【解决方案2】:

    右侧应该是一个列表,因为您要替换一个列表元素。所以你希望它是

    ... <- list(l2[[3]][[1]])
    

    此外,您可以考虑使用!nzchar(l1) 代替sapply(...) == ""。它可能更有效。最后的表达式是:

    l1[!nzchar(l1)] <- list(l2[[3]][[1]])
    

    给出更新的l1:

    $a
    [1] 1 2 3
    
    $b
    [1] 4 5 6 7 8 9
    
    $c
    [1] 100 101
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多