我有以下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_quantile
和lower_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
我想了解如何使用purrr
或tidyverse
工具执行此操作,因为我一直在尝试避免列表上的繁琐循环,并希望自动调整尺寸。
有人可以帮忙吗?
答案 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;