使用基于名称的另一个列表元素替换list元素

时间:2018-03-11 16:54:02

标签: r list replace

我有两个列表m.list和另一个r.list。 m.list具有NA个值。对于那些NA值的人,我想用r.list中的元素替换它。问题是当我在R中使用replace函数时,它会获取r.list的索引并返回不正确的值。以下是可重复的例子。有没有办法根据另一个列表中的元素名称替换一个列表的值?

m.list <- list(a= 1,b=NA,c=3,d=NA)

r.list <- list(a= 4,d=8,c=9)

mr.list <- replace(m.list, which(is.na(m.list)), r.list[which(is.na(m.list))])

这是我得到的输出b应该是NA,d应该是8:

> mr.list
$a
[1] 1

$b
[1] 8

$c
[1] 3

$d
NULL

这是所需的输出:

$a
[1] 1

$b
[1] NA

$c
[1] 3

$d
[1] 8

3 个答案:

答案 0 :(得分:2)

您可以使用replace但是您需要匹配列表的名称,并确保您还在替换参数中包含is.na(m.list)以确保相等的长度

l1 <- replace(m.list, is.na(m.list), 
                r.list[match(names(m.list), 
                     names(r.list))][is.na(m.list)])

给出,

$a
[1] 1

$b
NULL

$c
[1] 3

$d
[1] 8

注意:要将NULL替换为NA,只需

l1[lengths(l1) == 0] <- NA

答案 1 :(得分:2)

以下是modifyList

的选项
modifyList(m.list, r.list[intersect(names(r.list), names(which(is.na(m.list))))])
#$a
#[1] 1

#$b
#[1] NA

#$c
#[1] 3

#$d
#[1] 8

如果我们拆分代码,我们的想法是在&#39; m.list&#39;中找到names。价值缺失的地方,也可以在&#39; r.list&#39; (intersect),然后使用modifyList替换&#39; m.list&#39;中的值使用&#39; r.list&#39;

的子集
nm1 <- intersect(names(r.list), names(which(is.na(m.list))))
modifyList(m.list, r.list[nm1])

答案 2 :(得分:1)

我们可以先找到要替换的值的位置。它必须存在于r.list

a=names(m.list)%in%names(r.list)&is.na(m.list)
 replace(m.list, a, r.list[names(which(a))])
$a
[1] 1

$b
[1] NA

$c
[1] 3

$d
[1] 8