使用purrr获取列表

时间:2018-03-14 23:28:56

标签: r tidyverse purrr

我有以下reprex个10个样本矩阵列表:


# Sample of 10 3*3 matrices
z1 <- matrix(101:104, nrow = 2, ncol = 2)
z2 <- matrix(201:204, nrow = 2, ncol = 2)
z3 <- matrix(301:304, nrow = 2, ncol = 2)
z4 <- matrix(401:404, nrow = 2, ncol = 2)
z5 <- matrix(501:504, nrow = 2, ncol = 2)
z6 <- matrix(601:604, nrow = 2, ncol = 2)
z7 <- matrix(701:704, nrow = 2, ncol = 2)
z8 <- matrix(801:804, nrow = 2, ncol = 2)
z9 <- matrix(901:904, nrow = 2, ncol = 2)
z10 <- matrix(1001:1004, nrow = 2, ncol = 2)

# Combine all matrices into a single list
za <- list(z1, z2, z3, z4, z5, z6, z7, z8, z9, z10)

我们希望将za作为输入并获取2 2*2 matrices称为upper_quantilelower_quantile矩阵。

基本上,这是采用上面的10个矩阵列表,并采用相应条目的上限97.5%分位数。对于较低的2.5%分位数也是如此。

在这种情况下,我们可以手动为此示例构建upper_quantile矩阵,如下所示:

upper_quantile <- matrix(data = c(quantile(x = seq(101, 1001, by = 100), probs = 0.975),
                                  c(quantile(x = seq(102, 1002, by = 100), probs = 0.975)),
                                  c(quantile(x = seq(103, 1003, by = 100), probs = 0.975)),
                                  c(quantile(x = seq(104, 1004, by = 100), probs = 0.975)))
                         , nrow = 2
                         , ncol = 2
                         , byrow = FALSE)

upper_quantile
#>       [,1]  [,2]
#> [1,] 978.5 980.5
#> [2,] 979.5 981.5

我想了解如何使用purrrtidyverse工具执行此操作,因为我一直在尝试避免列表上的繁琐循环,并希望自动调整尺寸。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

这是一种略显笨重的方法,至少可以将所有东西都保存在一个管道中。它假设所有矩阵都是相同的维度,这需要是真的,否则所需的输出没有多大意义。使用purrr中的矩阵总是有点奇怪。该方法基本上是使用flatten来轻松按照我们想要的顺序对单元格进行分组,即每个位置一列。这让我们可以跨列映射以生成另一个向量,然后将该向量放回到正确的矩阵中。可能需要对比2x2更大的矩阵进行一些测试。

我想到的另一种方法是使用cross制作所有索引组合的列表,然后按照与您的示例类似的单元格映射并创建矩阵单元格。如果需要,可以尝试。

library(tidyverse)
z1 <- matrix(101:104, nrow = 2, ncol = 2)
z2 <- matrix(201:204, nrow = 2, ncol = 2)
z3 <- matrix(301:304, nrow = 2, ncol = 2)
z4 <- matrix(401:404, nrow = 2, ncol = 2)
z5 <- matrix(501:504, nrow = 2, ncol = 2)
z6 <- matrix(601:604, nrow = 2, ncol = 2)
z7 <- matrix(701:704, nrow = 2, ncol = 2)
z8 <- matrix(801:804, nrow = 2, ncol = 2)
z9 <- matrix(901:904, nrow = 2, ncol = 2)
z10 <- matrix(1001:1004, nrow = 2, ncol = 2)

# Combine all matrices into a single list
za <- list(z1, z2, z3, z4, z5, z6, z7, z8, z9, z10)

quant_mat <- function(list, p){
  dim = ncol(list[[1]]) * nrow(list[[1]])
  list %>%
    flatten_int() %>%
    matrix(ncol = dim, byrow = TRUE) %>%
    as_tibble() %>%
    map_dbl(quantile, probs = p) %>%
    matrix(ncol = ncol(list[[1]]))
}

quant_mat(za, 0.975)
#>       [,1]  [,2]
#> [1,] 978.5 980.5
#> [2,] 979.5 981.5
quant_mat(za, 0.025)
#>       [,1]  [,2]
#> [1,] 123.5 125.5
#> [2,] 124.5 126.5

reprex package(v0.2.0)创建于2018-03-14。

答案 1 :(得分:0)

对于使用tidyverse的单个分位数,这应该可以解决问题:

CREATE VIEW horse_owner
AS
SELECT b.firstname, b.lastname, b.primaryphone, 
h.barname

FROM boarder b
INNER JOIN boarder_horse bh
ON bh.boarder_id = b.id
INNER JOIN horse h
ON bh.horse_id = h.id

ORDER BY LastName DESC;