R 矩阵与向量的检验条件

R 矩阵与向量的检验条件,r,if-statement,matrix,conditional,R,If Statement,Matrix,Conditional,我想检查这个矩阵m,如果它是=10。如果是这样,我想更改另一个向量val的值。如果val是“A”,那么它应该更改为“B”,反之亦然。如果val为“C”,则应将其更改为“D”,反之亦然。如果矩阵m中没有值=10,则应返回val 因此,输出应该是 out "B" 我目前拥有的是以下内容 x = m[, 1] y = m[, 2] x.test = any(x <= 1) x.test = cbind(x.test, any(x >= 10) ) y.test = any(y &l

我想检查这个矩阵m,如果它是=10。如果是这样,我想更改另一个向量val的值。如果val是“A”,那么它应该更改为“B”,反之亦然。如果val为“C”,则应将其更改为“D”,反之亦然。如果矩阵m中没有值=10,则应返回val

因此,输出应该是

out 
"B"
我目前拥有的是以下内容

x = m[, 1]
y = m[, 2]

x.test = any(x <= 1)
x.test = cbind(x.test, any(x >= 10) )

y.test = any(y <= 1) 
y.test = cbind(y.test, any(y >= 10) ) 

 if (any(x.test)==TRUE || any(y.test)==TRUE && val == 'A')
  { val2 = 'B'
} else if (any(x.test)==TRUE || any(y.test)==TRUE && val == 'B') 
  { val2 = 'A'
} else if (any(x.test)==TRUE || any(y.test)==TRUE && val == 'C') 
  {val2 = 'D'
} else if (any(x.test)==TRUE || any(y.test)==TRUE && val == 'D') 
  {val2 = 'C'
} else { val2 = val }
x=m[,1]
y=m[,2]
x、 测试=任何(x=10))
y、 测试=任何(y=10))
if(any(x.test)==TRUE | | any(y.test)==TRUE&&val==A')
{val2='B'
}else如果(any(x.test)==TRUE | | any(y.test)==TRUE&&val==B')
{val2='A'
}else如果(any(x.test)==TRUE | | any(y.test)==TRUE&&val==C')
{val2='D'
}else如果(any(x.test)==TRUE | | any(y.test)==TRUE&&val==D')
{val2='C'
}else{val2=val}

但是它看起来很麻烦,而且工作不好…

如果条件满足,您可以创建一个数据帧,它就像一个字典一样,帮助您找到相应的
val2
。同时,您不需要单独测试矩阵的每一列,一条语句就足够了,就像一维向量一样:

dicFrame <- data.frame(val = c("A", "B", "C", "D"), val2 = c("B", "A", "D", "C"), stringsAsFactors = F)

#  val val2
#1   A    B
#2   B    A
#3   C    D
#4   D    C

val = "A"
val2 = if(any(mat >= 10 | mat <= 1)) dicFrame[dicFrame$val == val, 'val2'] else val
val2
# [1] "B"

dicFrame=10 | mat如果条件满足,您可以创建一个类似于字典的数据帧,并帮助您找到相应的
val2
。同时,您不需要单独测试矩阵的每一列,一条语句就足够了,就像一维向量一样:

dicFrame <- data.frame(val = c("A", "B", "C", "D"), val2 = c("B", "A", "D", "C"), stringsAsFactors = F)

#  val val2
#1   A    B
#2   B    A
#3   C    D
#4   D    C

val = "A"
val2 = if(any(mat >= 10 | mat <= 1)) dicFrame[dicFrame$val == val, 'val2'] else val
val2
# [1] "B"

dicFrame=10 | mat我同意Psidom使用查找表的建议,但要正确地矢量化解决方案,需要使用:

if(any(m=10L))映射$value[匹配(val,映射$key)]else val;
##[1]“A”“A”“D”“C”“B”“C”“C”“D”“D”“B”
数据

set.seed(1L);
NV <- 10L; val <- sample(LETTERS[1:4],NV,T);
m <- matrix(c(2L,4L,5L,0L,2L,11L,6L,6L,6L,6L),5L);
map <- data.frame(key=c('A','B','C','D'),value=c('B','A','D','C'),stringsAsFactors=F);

val;
##  [1] "B" "B" "C" "D" "A" "D" "D" "C" "C" "A"
map;
##   key value
## 1   A     B
## 2   B     A
## 3   C     D
## 4   D     C
set.seed(1L);

NV我同意Psidom关于使用查找表的建议,但要正确矢量化解决方案,您需要使用:

if(any(m=10L))映射$value[匹配(val,映射$key)]else val;
##[1]“A”“A”“D”“C”“B”“C”“C”“D”“D”“B”
数据

set.seed(1L);
NV <- 10L; val <- sample(LETTERS[1:4],NV,T);
m <- matrix(c(2L,4L,5L,0L,2L,11L,6L,6L,6L,6L),5L);
map <- data.frame(key=c('A','B','C','D'),value=c('B','A','D','C'),stringsAsFactors=F);

val;
##  [1] "B" "B" "C" "D" "A" "D" "D" "C" "C" "A"
map;
##   key value
## 1   A     B
## 2   B     A
## 3   C     D
## 4   D     C
set.seed(1L);

NV良好的选项与说明。加上一个。有描述的好选项。加一。