使用sapply替换列表中的空元素

时间:2017-04-01 13:40:49

标签: r lapply sapply

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

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)==“”]&lt; - l2 [[3]] [[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

2 个答案:

答案 0 :(得分:2)

只需在右侧使用l2[[3]][1](单[而非[[

答案 1 :(得分:1)

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

... <- 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