根据名称将列表元素替换为另一个列表元素

Posted

技术标签:

【中文标题】根据名称将列表元素替换为另一个列表元素【英文标题】:replace list element with another list element based on name 【发布时间】:2018-08-19 17:24:39 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这是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' 中找到缺少值的 names,并且在 'r.list' (intersect) 中也找到该值,然后使用 @987654325 @ 将 'm.list' 中的值替换为 'r.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

【讨论】:

【参考方案3】:

我们可以先找到要替换的值的位置。必须存在于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

【讨论】:

以上是关于根据名称将列表元素替换为另一个列表元素的主要内容,如果未能解决你的问题,请参考以下文章

列表替换中的 Prolog 元素

查找和替换列表中的元素

根据字典映射表替换列表中的元素

如何根据有序列表替换pandas dataframe列中的元素?

R:根据列表元素名称创建新的数据框变量

通过将元素替换为 0 来生成所有可能的列表