如何将列表中的每个项目除以不同列表中的两个项目的特定总和

时间:2018-03-27 13:10:01

标签: r

假设我有这样的列表:

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个向量。

请帮忙吗?

1 个答案:

答案 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