R 使用强制矩阵中的数据更新矩阵

R 使用强制矩阵中的数据更新矩阵,r,matrix,binary,R,Matrix,Binary,以下是我正在使用的代码: y <- c(0,5,10) n <- 9 R <- t(c(2.05, 2.05, 2.05, 2.55, 2.55, 2.55, 2.95, 2.95, 2.95)) R <- (replicate(3,R)) R <- (matrix(R, nrow=3)) R <- t(apply(R,1,sort)) mat <- t(sapply(y, function(test) pmax(seq(test, (test

以下是我正在使用的代码:

  y <- c(0,5,10)
n <- 9 

R <- t(c(2.05, 2.05, 2.05, 2.55, 2.55, 2.55, 2.95, 2.95, 2.95))
R <- (replicate(3,R))
R <- (matrix(R, nrow=3))
R <- t(apply(R,1,sort))

mat <- t(sapply(y, function(test) pmax(seq(test, (test-n+1), -1), 0) ))
mat




P <- replicate(ncol(R),(c(6447.88,6447.88,6447.88)))

EnvTest <- new.env()
EnvTest$Orig <- 548453.5

FuncTest <- function(pp){
  EnvTest$Orig <- EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200)
  return(EnvTest$Orig)
}

Test<- rbind(EnvTest$Orig,
             do.call(rbind,lapply(1:9, FuncTest)))
x <- t(Test)
x
这就是我告诉函数要做的,这是正确的。但是现在我想使用矩阵
R*(mat==0)
中的一些信息,即:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
[2,] 0.00 0.00 0.00 0.00 0.00 2.55 2.95 2.95 2.95
[3,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
所以我试着做这样的事情

 FuncTest2 <- function(pp){
          EnvTest$Orig <- ifelse(R*(mat==0)==0,EnvTest$Orig,EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200))
                 return(EnvTest$Orig)
        }
        Test2<- rbind(EnvTest$Orig,
                     do.call(rbind,lapply(1:9, FuncTest2)))
        x2 <- t(Test2)
        x2

因此,基本上,如果R*(mat==0)=0,那么
EnvTest$Orig首先,关于
FuncTest()
FuncTest2()
计算,
R
是一个常量,因为在这些函数调用期间或周围的数据操作(参考
do.call()
/
rbind()
/
t())不会修改它
stuff)。这是
R

R;
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
## [2,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
## [3,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
正如您所看到的,它的任何元素都不是零。这意味着

R*(mat==0)==0
相当于

mat!=0
因为用
R
相乘不能将非零值变成零值,也不能将零值变成非零值

如果您仍然希望参数化
ifelse()
条件为
R
,可能是因为您可能希望为可能包含零的
R
的不同值运行此代码,那么应该将其重写为

R==0|mat!=0
其次,您的代码在状态变量
envetest$Orig
的维度方面有点可疑。您将其初始化为一个元素向量(548453.5),但在第一次运行
FuncTest()
时,它会立即被一个三元素向量覆盖,其中初始标量循环三次以适应三元素向量
P[,pp]
R[,pp]
。从这一点开始,它永远是一个三元素向量。在
FuncTest2()
(首次尝试)中,由于
mat
R
是3x9矩阵,因此将循环
ifelse()
矢量化三元数的真参数和假参数以覆盖该维度,然后生成的3x9矩阵将覆盖
envetest$Orig
。从那时起,它将永远是一个3x9矩阵

您可能应该仔细考虑您想要的
envetest$Orig
的维度,并从头到尾坚持到底。从预期输出判断,似乎希望它是长度为3的向量,因此应该在
ifelse()
条件中索引矩阵:

FuncTest2 <- function(pp) {
    EnvTest$Orig <- ifelse(R[,pp]==0|mat[,pp]!=0,EnvTest$Orig,EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200));
    return(EnvTest$Orig);
};
EnvTest$Orig <- 548453.5;
Test2 <- rbind(EnvTest$Orig,do.call(rbind,lapply(1:9,FuncTest2)));
x2 <- t(Test2);
x2;
##          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
## [1,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
## [2,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 543171.1 538058.5 532933.3 527795.6
## [3,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5

FuncTest2哦,很抱歉,副本和过去的副本中发生了一些奇怪的事情second@akrun这样更好吗?@akrun乍一看有什么吗?乍一看,我想,
ifelse
@akrun的长度可能不一样。我也在想,也许一个在FuncTest中带有if-else语句的sapply函数可以实现这一点,但我无法运行。谢谢你的回答,我会花一些时间来消化它。我是手工计算第二行的,所以很可能我只是犯了一个错误。很奇怪,你的答案对x2或x2[2,8]中的第二个更新值不起作用。有什么想法吗?它确实有用:
envetest$Orig
mat!=0
R==0|mat!=0
FuncTest2 <- function(pp) {
    EnvTest$Orig <- ifelse(R[,pp]==0|mat[,pp]!=0,EnvTest$Orig,EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200));
    return(EnvTest$Orig);
};
EnvTest$Orig <- 548453.5;
Test2 <- rbind(EnvTest$Orig,do.call(rbind,lapply(1:9,FuncTest2)));
x2 <- t(Test2);
x2;
##          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
## [1,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
## [2,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 543171.1 538058.5 532933.3 527795.6
## [3,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5