我有一个列表列表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;
我怎样才能实现这一目标?该函数的最终结果将是更新列表列表。感谢。
答案 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]])
已修订次要改进和替代方案。