我有一个列表“temp”,等于
[[1]]
[1] 8 0 3
[[2]]
[1] 6 4 0
[[3]]
[1] 0 5 0
和向量vec = c(1,2,3,4,5,6,7,8,9)
。我想得到一份清单
具有与“temp”相同的结构,其中包含最大值
对于temp和vec之间的每个元素。所需的新列表将等于
[[1]]
[1] 8 2 3
[[2]]
[1] 6 5 6
[[3]]
[1] 7 8 9
如果我执行
mapply(max, temp, vec)
我得到了
8 6 5 8 6 6 8 8 9
这是错误的结果和错误的结构。
如果我执行
lapply(temp, function(x) mapply(max, unlist(temp), vec))
我得到以下
[[1]]
[1] 8 2 3 6 5 6 7 8 9
[[2]]
[1] 8 2 3 6 5 6 7 8 9
[[3]]
[1] 8 2 3 6 5 6 7 8 9
这在某种程度上是错误结构的正确结果。 是否有矢量化的方式来获得所需的效果?这很重要 为了这个运行得非常快......
谢谢!!!
答案 0 :(得分:3)
temp <- list(c(8,0,3),c(6,4,0),c(0,5,0))
vec <- c(1,2,3,4,5,6,7,8,9)
使用temp
列表的维度,您可以拆分和比较:
Map(pmax, temp, split(vec, rep(seq_along(temp),sapply(temp,length))))
...或比较和分裂:
split( pmax(unlist(temp),vec), rep(seq_along(temp),sapply(temp,length)) )
..或者只是为了表明有百万种方法可以做任何事情:
split(sweep(do.call(rbind,temp),2:1,vec,FUN="pmax"),1:length(temp))
结果:
[[1]]
[1] 8 2 3
[[2]]
[1] 6 5 6
[[3]]
[1] 7 8 9