【问题标题】:How to collect outputs of multivariable vector-valued function into a dataframe?如何将多变量向量值函数的输出收集到数据框中?
【发布时间】:2021-04-07 10:36:10
【问题描述】:

我有一个函数 f1 接受一对实数 (x, y) 并返回实数的三倍。我想在向量ay 中为向量b 中的所有x 收集此函数的所有输出。能否请您详细说明如何操作?

f1 <- function(x, y){
  return (c(x+y, x-y, x*y))
}

a <- seq(0, pi, 0.1)
b <- seq(0, 2 * pi, 0.1)

更新:我的意思是所有对 $(x, y) \in a \times b$。

【问题讨论】:

    标签: r function dataframe vector


    【解决方案1】:

    这是一个data.table 选项

    setDT(expand.grid(a, b))[, fval := do.call(Vectorize(f1, SIMPLIFY = FALSE), unname(.SD))][]
    

    在哪里使用expand.grid + do.call + Vectorize,给出

          Var1 Var2              fval
       1:  0.0  0.0             0,0,0
       2:  0.1  0.0       0.1,0.1,0.0
       3:  0.2  0.0       0.2,0.2,0.0
       4:  0.3  0.0       0.3,0.3,0.0
       5:  0.4  0.0       0.4,0.4,0.0
      ---
    2012:  2.7  6.2  8.90,-3.50,16.74
    2013:  2.8  6.2  9.00,-3.40,17.36
    2014:  2.9  6.2  9.10,-3.30,17.98
    2015:  3.0  6.2     9.2,-3.2,18.6
    2016:  3.1  6.2  9.30,-3.10,19.22
    

    更紧凑的是使用CJ(a,b) 而不是setDT(expand.grid(a, b))(感谢@akrun 的建议)

    【讨论】:

    • 我认为CJ(a, b) 会比setDT(expand.grid(a, b)) 更紧凑
    • @akrun 谢谢,那绝对更紧凑 :) 新年快乐!
    【解决方案2】:

    我们可以使用expand.grid 扩展'a' 和'b' 值之间的数据,然后循环使用applyMARGIN = 1 并应用f1

    out <- as.data.frame(t(apply(expand.grid(a, b), 1, function(x) f1(x[1], x[2]))))
    

    或者tidyverse

    library(dplyr)
    library(purrr)
    library(tidyr)
    
    out2 <- crossing(x = a, y = b) %>% 
           pmap_dfr(f2)
    

    -输出

    head(out2)
    # A tibble: 6 x 3
    #    add subtract multiply
    #  <dbl>    <dbl>    <dbl>
    #1   0        0          0
    #2   0.1     -0.1        0
    #3   0.2     -0.2        0
    #4   0.3     -0.3        0
    #5   0.4     -0.4        0
    #6   0.5     -0.5        0
    

    在哪里f2

    f2 <- function(x, y){
        return (tibble(add = x+y, subtract = x-y, multiply = x*y))
      }
    

    returnlisttibble 可能会更好,这样会更容易

    【讨论】:

      【解决方案3】:

      使用expand.grid 创建所有可能的组合,并使用Mapf1 应用于每一对。

      val <- expand.grid(a, b)
      result <- do.call(rbind, Map(f1, val$Var1, val$Var2))
      head(result)
      
      #     [,1] [,2] [,3]
      #[1,]  0.0  0.0    0
      #[2,]  0.1  0.1    0
      #[3,]  0.2  0.2    0
      #[4,]  0.3  0.3    0
      #[5,]  0.4  0.4    0
      #[6,]  0.5  0.5    0
      

      【讨论】:

        猜你喜欢
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2019-11-05
        • 2012-05-13
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多