我正在使用R中的两个列表,并尝试将一个列表的元素替换为另一个列表的元素。但是,每个列表的替换都由第三个列表索引。考虑
> template
$X1
[1] 0 0 0 0 0 0 0
$X2
[1] 0 0 0 0 0 0 0
$X3
[1] 0 0 0 0 0 0 0
$X4
[1] 0 0 0 0 0 0 0
...
$X35
[1] 0 0 0 0 0 0 0
和
> replace_table
$X1
[1] 5 6 7
$X2
[1] 4 6 7
$X3
[1] 4 5 7
$X4
[1] 4 5 6
...
$X35
[1] 1 2 3
还要说我有清单
> set
[1] 3 5 1
所以这里的想法是遍历模板并用replace_list替换每个模板列表中的元素。所以模板最终看起来像这样
> template
$X1
[1] 0 0 0 0 3 5 1
$X2
[1] 0 0 0 3 0 5 1
$X3
[1] 0 0 0 3 5 0 1
$X4
[1] 0 0 0 3 5 1 0
...
$X35
[1] 3 5 1 0 0 0 0
有关如何做到这一点的任何想法?我尝试过使用
lapply(c(1:length(template)), function(x) template[[x]][c(replace_list[[x]])]=c(set))
但这不起作用。
答案 0 :(得分:3)
我们可以使用Map
。根据显示的数据,' replace_list'看起来更像vector
。 Map
是mapply
(sapply
的多变量版本)SIMPLIFY=FALSE
的包装器。它的工作原理是对列表的相应元素进行操作('模板'' replace_table')。当我们转换' replace_list'到list
,它会被回收到其他两个列表的长度。
Map(`[<-`, template, replace_table, list(replace_list))
#$X1
#[1] 0 0 0 0 3 5 1
#$X2
#[1] 0 0 0 3 0 5 1
#$X3
#[1] 0 0 0 3 5 0 1
#$X4
#[1] 0 0 0 3 5 1 0
[<-
正在分配&#39;模板&#39;使用&#39; replace_table&#39;列出元素元素作为&#39; replace_list&#39;的索引。矢量。
如果我使用匿名函数,那就是
Map(function(x,y,z) {x[y] <- z;x}, template, replace_table, list(replace_list))
template <- setNames(lapply(1:4, function(i) rep(0,7)), paste0('X',1:4))
replace_table <- setNames(list(5:7, c(4,6,7), c(4,5,7), 4:6), names(template))
replace_list <- c(3,5,1)
答案 1 :(得分:3)
我还建议Map
,但以下内容可能更接近您的想法:
lapply(seq_along(template), function(x) {
replace(template[[x]], replace_table[[x]], replace_list)
})