lapply在两个列表向量上

时间:2014-03-29 13:54:44

标签: r list

我有一个列表列表p

p <- list(1:5,4:8,7:11)

和另一份清单

q <- list(2:3,1:2,4:5)

我想为p中的每个列表和q中的相应列表设置

p[q] <- Inf;

例如, (1:5)[2:3]&lt; - Inf,(4:8)[1:2]&lt; - inf,和(7:11)[4:5]&lt; - Inf;

我怎样才能实现这一目标?该函数的最终结果将是更新列表列表。感谢。

2 个答案:

答案 0 :(得分:4)

你可以这样做:

p <- Map(`[<-`, p, q, Inf)

可能更容易理解的是更长的等效版本

p <- mapply(function(x, y, z) {x[y] <- z; x}, p, q, Inf, SIMPLIFY = FALSE)

答案 1 :(得分:4)

mapply / [&lt; -

> mapply("[<-", p, q, Inf, SIMPLIFY = FALSE)
[[1]]
[1]   1 Inf Inf   4   5

[[2]]
[1] Inf Inf   6   7   8

[[3]]
[1]   7   8   9 Inf Inf

mapply / replace

mapply(replace, p, q, Inf, SIMPLIFY = FALSE)

lapply / replace

lapply(seq_along(p), function(i) replace(p[[i]], q[[i]], Inf))

作为

for(i in seq_along(p)) p[[i]][ q[[i]] ] <- Inf

替换/融化

如果p的每个组件具有相同的长度(如问题中的示例所示),我们可以将p转换为data.frame,从而开辟更多可能性。这将返回一个数据框:

library(reshape2)
replace(as.data.frame(p), as.matrix(melt(q)), Inf)

vapply / replace

这也假设p的每个组件都有相同的长度返回矩阵:

vapply(seq_along(p), function(i) replace(p[[i]], q[[i]], Inf), 0 * p[[1]])

已修订次要改进和替代方案。