如何识别输出低于某个阈值的两个变量的哪些组合?

问题描述 投票:0回答:2

我有一个 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 的组合?任何提示都非常有用。

谢谢!

r combinations combn
2个回答
2
投票

对于两个不同长度的向量,可以使用

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)), ]

2
投票

如果您关心具有特定过滤条件的s1s2所有可能组合的

索引
,您可以尝试如下
expand.grid
+
subset

subset(
    expand.grid(
        j1 = seq_along(s1),
        j2 = seq_along(s2)
    ),
    s1[j1] * s2[j2] < 20 - max(z1)
)
© www.soinside.com 2019 - 2024. All rights reserved.