基于名称替换列表元素为另一个列表元素

8

我有两个列表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个回答

5

这里有一个使用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

如果我们分割代码,那么我们的想法是在“m.list”中找到值丢失并且也在“r.list”(交集)中找到的names,然后使用modifyList用“r.list”的子集替换“m.list”的值。
nm1 <- intersect(names(r.list), names(which(is.na(m.list))))
modifyList(m.list, r.list[nm1])

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
在替换前,我们需要先找到要替换的值所在的位置。该值必须存在于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接