首页 > 解决方案 > 计算三个列表中的数字并生成一个大列表

问题描述

我需要用 in 中B的每个数字A和 inm0中的公式计算每个数字fun。通过应用,如果 m0 是单个数字ge <- lapply(B,fun),我可以计算每个数字中A的每个数字。B如果我现在有多个m0代码中指定的,我该怎么办?

我认为即使是计算各种但单一的B,我在一个函数中所做的,然后再次不是一个聪明的方法。Am0lapplylapply

预期的输出是一个列表,其中的值是B用不同数量的A和计算的m0

这是gewhenm0是单个值的结构。

在此处输入图像描述


fun <- function (i){
  res <- lapply(A, function(x){
    g <- as.matrix (m0 * (-x * i))})}
ge <- lapply(B, fun)

m0 <- c(10,20)
A <- c(1,2)
B <- list(per1 = structure(list(t1 = c(1,2), t2 = c(3,4)), row.names = c(NA, 
                                                                        -2L), class = "data.frame"),
          per2 = structure(list(t1 = c(10,20), t2 = c(30,40)), row.names = c(NA, 
                                                                         -2L), class = "data.frame"))

标签: rlistfunctionlapply

解决方案


如果我理解正确的话

根据

m0 <- c(10, 20)
A <- c(1,2)
B <- list(
  per1 = structure(list(t1 = c(1, 2), t2 = c(3, 4)),
    row.names = c(NA, -2L),
    class = "data.frame"
  ),
  per2 = structure(list(t1 = c(10, 20), t2 = c(30, 40)),
    row.names = c(NA, -2L),
    class = "data.frame"
  )
)

fun <- function (i){
  lapply(A, function(x){
    lapply(m0, function(y) y * (-x * i)
    )
  }
  )
}

lapply(B, fun)
#> $per1
#> $per1[[1]]
#> $per1[[1]][[1]]
#>    t1  t2
#> 1 -10 -30
#> 2 -20 -40
#> 
#> $per1[[1]][[2]]
#>    t1  t2
#> 1 -20 -60
#> 2 -40 -80
...

reprex 包于 2021-02-10 创建(v1.0.0)

使用tidyverse 1

library(tidyverse)
m0 <- c(10, 20)
A <- c(1, 2)
B <- list(
  per1 = structure(list(t1 = c(1, 2), t2 = c(3, 4)),
    row.names = c(NA, -2L),
    class = "data.frame"
  ),
  per2 = structure(list(t1 = c(10, 20), t2 = c(30, 40)),
    row.names = c(NA, -2L),
    class = "data.frame"
  )
)
df_expand <- expand_grid(A, m0, B) 

fn <- function(A, m0, B) {
  m0 * (-A * B)
}

res <- pmap(df_expand, fn)
nm <- with(df_expand, paste0(names(B), "-A", A, "-m0_",m0))
purrr::set_names(res, nm)
#> $`per1-A1-m0_10`
#>    t1  t2
#> 1 -10 -30
#> 2 -20 -40
#> 
#> $`per2-A1-m0_10`
#>     t1   t2
#> 1 -100 -300
#> 2 -200 -400

reprex 包于 2021-02-10 创建(v1.0.0)

使用tidyverse 2

library(tidyverse)
m0 <- c(10, 20)
A <- c(1, 2)
B <- list(
  per1 = structure(list(t1 = c(1, 2), t2 = c(3, 4)),
                   row.names = c(NA, -2L),
                   class = "data.frame"
  ),
  per2 = structure(list(t1 = c(10, 20), t2 = c(30, 40)),
                   row.names = c(NA, -2L),
                   class = "data.frame"
  )
)
map(m0, function(z) map(-A, function(x) map(B, function(y) x * y * z)))  
#> [[1]]
#> [[1]][[1]]
#> [[1]][[1]]$per1
#>    t1  t2
#> 1 -10 -30
#> 2 -20 -40
#> 
#> [[1]][[1]]$per2
#>     t1   t2
#> 1 -100 -300
#> 2 -200 -400

reprex 包于 2021-02-10 创建(v1.0.0)


推荐阅读