首页 > 解决方案 > 构建nxn矩阵,其中每一列代表一个函数,每一行代表一个参数。(缩短代码)

问题描述

我创建了一个 10x10 矩阵,其中每一列代表函数 FUN1 到 FUN10,每一行代表参数 P1 到 P10。

a <- NULL
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P1,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P2,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P3,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P4,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P5,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P6,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P7,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P8,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P9,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN1(data,P10,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN2(data,P1,x))))
...
a <- rbind(a,(sapply(c(1:n), function(x) FUN2(data,P10,x))))
a <- rbind(a,(sapply(c(1:n), function(x) FUN3(data,P1,x))))
...
a <- rbind(a,(sapply(c(1:n), function(x) FUN3(data,P10,x))))
...
a <- rbind(a,(sapply(c(1:n), function(x) FUN10(data,P1,x))))
...
a <- rbind(a,(sapply(c(1:n), function(x) FUN10(data,P10,x))))
a <- as.vector(a)
MM <- matrix(a,nrow=10,byrow=FALSE)

我怎样才能使这段代码更短?

标签: r

解决方案


我们可以使用“n”、 s 和“P”对象名称expand.grid的序列的所有组合创建一个 data.frameFUN

n <- 10
d1 <- expand.grid(n = seq_len(n), f = paste0("FUN", 1:10), 
       p = paste0("P", 1:10), stringsAsFactors = FALSE)

然后循环rows,将函数应用于“数据”,并将unlist输出listvector

a <- do.call(rbind, lapply(seq_len(nrow(d1)), function(i) 
       match.fun(d1$f[i])(data, get(d1$p[i]), d1$n[i])))
MM <- matrix(a, nrow = 10, byrow = FALSE)

或者这可以用tidyverse

library(dplyr)
library(tidyr)
library(stringr)
crossing(n = seq_len(n), f = paste0("FUN", 1:10),
         p = str_c("P", 1:10)) %>%
        pmap(~ match.fun(..2)(data, get(..3), ..1)) %>%
        unlist %>%
        matrix(., nrow = 10, byrow = FALSE)

推荐阅读