【问题标题】:How to divide each item of a list by a specific sum of two items from different list如何将列表的每个项目除以不同列表中两个项目的特定总和
【发布时间】:2018-03-27 13:10:00
【问题描述】:

假设我有这样的列表:

x <- list(rnorm(10, 0, 2), rnorm(10, 0, 3))
z <- list(rnorm(10, 1, 2), rnorm(10, 1, 3))
d <- list(x,z)

然后,我想将第一个列表的第一个向量与第二个列表的第一个向量相加。并且第一个列表的第二个向量与第二个列表的第二个向量。也就是说,我想对相应的向量求和。第一个列表中的第一个与第二个列表中的第一个等等。然后,将第一个列表的第一个向量除以第一个 some。第二个列表的第一个向量也是如此,依此类推。

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

有什么帮助吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    一种选择是在transpose 之后使用reduce

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2014-07-21
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多