假设我有一个包含两个向量的列表。然后,我想取第一个向量的第一个元素,然后除以它的总和和列表第二个向量的第一个元素。然后对第一个列表的所有元素执行此操作。之后,使用列表的第二个向量执行相同的操作。
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]])
我该如何自动执行此操作?有什么帮助吗?
答案 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;
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