我有一个函数f1,它接受一对实数(x, y)并返回实数的三倍。我想收集这个函数的所有输出,用于向量x中的所有a和向量b中的y。请你详细说明一下如何做好吗?
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) \在a\倍b$中。
发布于 2020-12-31 00:22:33
我们可以使用expand.grid扩展'a‘和'b’值之间的数据,然后用apply、MARGIN = 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)-output
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))
}最好是return a list或tibble,这样就更容易了。
发布于 2020-12-31 01:14:49
这里有一个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的建议)
发布于 2020-12-31 02:09:44
使用expand.grid创建所有可能的组合,并使用Map将f1应用于每一对。
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 0https://stackoverflow.com/questions/65515169
复制相似问题