假设我有这样的列表:
x <- list(rnorm(10, 0, 2), rnorm(10, 0, 3))
z <- list(rnorm(10, 1, 2), rnorm(10, 1, 3))
d <- list(x,z)
然后,我想将第一个列表的第一个向量与第二个列表的第一个向量相加。并且第一个列表的第二个向量与第二个列表的第二个向量。也就是说,我想总结相应的向量。第一个列表中的第一个列表中的第一个列表,依此类推。然后,将第一个列表的第一个向量除以第一个向量。第二个列表的第一个向量相同,依此类推。
y1 <- d[[1]][[1]]+d[[2]][[1]]
y2 <– d[[1]][[2]]+d[[2]][[2]]
然后,我想将第一个列表的第一个向量除以第一个和。第二个列表的第一个向量相同。然后将每个列表的第二个向量除以第二个和。这样:
d[[1]][[1]]/y1
d[[1]][[2]]/y2
d[[2]][[1]]/y1
d[[2]][[2]]/y2
我可以手动执行此操作,但是,如何对列表中的任意数量的元素执行此操作。也就是说,假设我2
列出了10
个向量。
请帮忙吗?
答案 0 :(得分:1)
一种选择是在reduce
transpose
library(tidyverse)
d %>%
transpose %>%
map(~ .x %>% reduce(`+`))
对于第二部分,扩展上面的
out <- d %>%
transpose %>%
map(~ .x %>% reduce(`+`)) %>% #get the sum
replicate(length(d), ., simplify = FALSE) %>% #replicate to make lengths same
map2(d, ., ~ map2(.x, .y, `/`)) #loop through the nested elements and divide
identical(out[[1]][[1]], d[[1]][[1]]/y1)
#[1] TRUE
identical(out[[1]][[2]], d[[1]][[2]]/y2)
#[1] TRUE