我有两个列表 m.list 和另一个 r.list。m.list 有NA值。对于那些有NA值的人,我想用 r.list 中的元素替换它。问题是当我replace在 R 中使用函数时,它采用 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))])
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出 b 应该是 NA 并且 d 应该是 8:
> mr.list
$a
[1] 1
$b
[1] 8
$c
[1] 3
$d
NULL
Run Code Online (Sandbox Code Playgroud)
这是所需的输出:
$a
[1] 1
$b
[1] NA
$c
[1] 3
$d
[1] 8
Run Code Online (Sandbox Code Playgroud)
这是一个选项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
Run Code Online (Sandbox Code Playgroud)
如果我们拆分代码,想法是在“m.list”中找到names缺少值的位置,并且在“r.list”( intersect) 中也找到该值,然后将modifyList“m.list”中的值替换为'r.list' 的子集
nm1 <- intersect(names(r.list), names(which(is.na(m.list))))
modifyList(m.list, r.list[nm1])
Run Code Online (Sandbox Code Playgroud)