我有一个 R 编码问题想分享。假设我们有以下内容:
z1= c(2, 4, 6, 8)
s1= seq(-13, 14, by = 0.1)
s2= seq(-13, 14, by = 0.1)
Function<-function(s1,s2){
Y<-matrix(0,nrow=length(s1),ncol=length(z1))
for (j in 1:length(s1)){
for (i in 1:length(z1)){
Y[j,i]<- s1[j]*s2[j] + z1[i]}}
return(Y)
}
因此,s1 和 s2 是输入,它们可以具有区间 [-13, 14] 中的任何值。它们每次可以具有相同的值,也可以具有不同的值。 现在,我想知道如何识别 s1 和 s2 的哪些组合产生的输出(全部)小于某个阈值,比如 20。例如,如果
s1= 2
和 s2= 4
那么我们知道上面的函数有四个输出(四个,因为 i=1,...,4),如下:
Y= 8+ 2 for i=1
Y= 8+ 4 for i=2
Y= 8+ 6 for i=3
Y= 8+ 8 for i=4
在这种情况下,所有这些输出都小于 20,因此可以选择组合 (2,4)。但是,如何将其应用于 s1 和 s2 可能值的整个范围,然后仅选择那些输出均小于 20 的组合?任何提示都非常有用。
谢谢!
对于两个不同长度的向量,可以使用
expand.grid
+ apply
:
#Create the vectors
s1 = seq(2, 5, by = 1)
s2 = seq(0, 3, by = 1)
z1 = c(2, 4, 6, 8)
#I simplified your function
f <- function(x1, x2) sapply(x1 * x2, `+`, z1)
gr <- expand.grid(s1, s2)
gr[apply(gr, 1, \(x) all(f(x[1], x[2]) <= 20)), ]
如果您关心具有特定过滤条件的s1
、s2
所有可能组合的
expand.grid
+ subset
subset(
expand.grid(
j1 = seq_along(s1),
j2 = seq_along(s2)
),
s1[j1] * s2[j2] < 20 - max(z1)
)