列表列表中的pmax函数

时间:2015-05-11 18:43:59

标签: r for-loop nested-lists

我有一些列表存储在列表中。第三级包含一个带有数值和一些NA的向量。

我想使用pmax来找到具有相同位置的两个向量之间的最高值。

pmax(low_all_res[[1]][[1]][[1]], high_all_res[[1]][[1]][[1]])

这可以工作并输出一个列表。但是我想为很多具有不同索引的列表这样做。基本上我想比较low_all_res和high_all_res并从它们之间获得最高值。

我的数据结构如下:

low_all_res[[1:5]][[1:5]][[1:10]]

这是我想要在低和高之间进行比较的最后一个列表中的列表。

然后我尝试了:

comb_all_res <- list()
for (k in 1:5){
  for(m in 1:5){
    for (i in 1:10){
      comb_all_res[[k]][[m]][[i]] <- pmax(low_all_res[[k]][[m]][[i]], high_all_res[[k]][[m]][[i]]) 
}}}

Error in `*tmp*`[[k]] : subscript out of bounds

但是如图所示得到错误。

我也尝试过使用临时文件的方法,但我认为我对tmp文件使用了错误的索引操作符。这段代码看起来像这样,但我尝试了很多不同的方法。代码有效,但我只得到最后10个向量的结果。

comb_all_res <- list()
tmp_low <- list()
tmp_high <- list()
tmp_low2 <- list()
tmp_high2 <- list()

for (i in 1:10){

  for (k in 1:5){

  tmp_low <- low_all_res[[k]]
  tmp_high <- high_all_res[[k]]

    for(m in 1:5){

    tmp_low2 <- tmp_low[[m]] 
    tmp_high2 <- tmp_high[[m]]

    comb_all_res[[i]] <- pmax(tmp_low2[[i]], tmp_high2[[i]])

}}}

任何人都可以批评我的代码,所以我可以直接理解吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

# Some fake data:
set.seed(123)
list_1 <- list(list(list(1:5), list(rep(3,5)), list(sample(1:10, 5))), list(list(sample(10:15)), list(rep(10,5)), list(sample(100:110, 5))))
list_2 <- list(list(list(5:1), list(rep(5,5)), list(sample(10:1, 5))), list(list(sample(15:10)), list(rep(20,5)), list(sample(1000:110, 5))))

pmax(unlist(list_1), unlist(list_2))
 [1]   5   4   3   4   5   5   5   5   5   5   8  10   4   7   6  11  12  13  14  15  15  20  20
[24]  20  20  20 471 743 870 145 200

要将结果放入与原始列表类似结构的列表中,您可以执行以下操作(感谢Ananda Mahto helped to find relist):

relist(pmax(unlist(list_1), unlist(list_2)), skeleton = list_1)
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 5 4 3 4 5


[[1]][[2]]
[[1]][[2]][[1]]
[1] 5 5 5 5 5


[[1]][[3]]
[[1]][[3]][[1]]
[1]  8 10  4  7  6



[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
[1] 11 12 13 14 15 15


[[2]][[2]]
[[2]][[2]][[1]]
[1] 20 20 20 20 20


[[2]][[3]]
[[2]][[3]][[1]]
[1] 471 743 870 145 200