使用其他列表替换列表元素

时间:2015-08-21 13:23:56

标签: r

我正在使用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))

但这不起作用。

2 个答案:

答案 0 :(得分:3)

我们可以使用Map。根据显示的数据,' replace_list'看起来更像vectorMapmapplysapply的多变量版本)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)
})