Sum指定子列表的元素

时间:2017-11-06 09:58:00

标签: r

想法:

假设我有一个包含两个向量的列表。然后,我想取第一个向量的第一个元素,然后除以它的总和和列表第二个向量的第一个元素。然后对第一个列表的所有元素执行此操作。之后,使用列表的第二个向量执行相同的操作。

列表代码:

tau1 <- list(c(0.43742669 , 0.64024429,  0.39660069,  0.11849773), c(0.5060767, 0.4857891, 0.4553237, 0.5045598))

我的代码只有两个向量。

 Tau1 <- vector('list', 2)
for(i in seq_along(tau1)){
  for(j in 1:length(tau1[[1]])){
    Tau1[[i]][[j]] <- tau1[[i]][[j]] / Reduce('+', tau1[[1]][[j]], tau1[[2]][[j]])

  }

}

实施例

列表的第一个元素:

TT1 <- tau1[[1]][[1]]/(tau1[[1]][[1]]+tau1[[2]][[1]])
 [1] 0.4636196

然后是列表的第二个元素:

 TT2 <- tau1[[2]][[1]]/(tau1[[1]][[1]]+tau1[[2]][[1]])
   [1] 0.5363804

问题:

我想为任意数量的向量做到这一点。例如,

Reduce('+', tau1[[1]][[j]], tau1[[2]][[j]], tau1[[3]][[j]], tau1[[4]][[j]])

我该如何自动执行此操作?有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

要使用任意数量的列表元素,请使用[[应用函数系列。

要在每个子列表中提取j元素,请使用sapply(tau1, "[[", j)。要对这些元素求和,请使用:sum(sapply(tau1, "[[", j))

PS:为了以防万一,您应该for(j in 1:length(tau1[[1]]){}而不是for(j in 1:length(tau1[[i]]){}

答案 1 :(得分:2)

如果我们使用Reduce,那么我们需要移除[[i]]以获取相应list元素的总和以获得vector。然后通过第j个索引进行子集,以划分&#39; tau1 [[i]]&#39;

的第j个元素
Tau1 <- vector('list', 2)
for(i in seq_along(tau1)){
  for(j in seq_along(tau1[[1]])){
    Tau1[[i]][[j]] <- tau1[[i]][[j]] /Reduce(`+`, tau1)[j]
      }

   }

关于注释中提到的错误,如果存在非数字元素,则可能会发生错误。 OP提到了NULL元素,但NULL作为list中的单个元素出现。因此,有可能存在字符"NULL"。例如,

tau1 <- list(c(0.43742669 , 0.64024429,  "NULL",  0.11849773), 
        c(0.5060767, 0.4857891, 0.4553237, 0.5045598))

运行上面的代码

  

f(init,x [[i]])出错:二元运算符的非数字参数

答案 2 :(得分:2)

这是基础R单线:

lapply(tau1, "/", do.call(mapply, c(FUN = sum, tau1)))

# [[1]]
# [1] 0.4636196 0.5685838 0.4655351 0.1901875
# 
# [[2]]
# [1] 0.5363804 0.4314162 0.5344649 0.8098125

或者(来自@ lmo&#39;评论):

lapply(tau1, "/", Reduce("+", tau1))

这是一个purrr等价物:

library(purrr)

tau1 %>% map(`/`, pmap_dbl(., sum))

# [[1]]
# [1] 0.4636196 0.5685838 0.4655351 0.1901875
# 
# [[2]]
# [1] 0.5363804 0.4314162 0.5344649 0.8098125