首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据来自另一个矩阵的条件为矩阵编写for循环?

如何根据来自另一个矩阵的条件为矩阵编写for循环?
EN

Stack Overflow用户
提问于 2017-05-05 10:18:19
回答 1查看 58关注 0票数 0

我试图根据另一个矩阵中的条件得到一个新的矩阵。原始矩阵(矩阵1)如下所示:

代码语言:javascript
复制
[empty] |V1     |V2     |V3    |V4    |V5    |....  |V17   | V18
1       |NA     |NA     |name1 |name2 |name3 |....  |name15|NA
2       |abc    |2016   |NA    |10    |20    |....  |NA    |name1
3       |abc    |2016   |NA    |10    |20    |....  |NA    |name2
4       |abc    |2016   |NA    |10    |20    |....  |NA    |name3
...     |abc    |2016   |NA    |10    |20    |....  |NA    |....
16      |abc    |2016   |NA    |10    |20    |....  |NA    |name15

我试图编码的是一个新的矩阵(矩阵2),它有以下条件:如果有关列中矩阵1的第一行的值等于有关行中矩阵1最后一列的值,那么矩阵2应该在有关单元格中写下原来在矩阵1中的值;如果条件不成立,它应该写"NA“。例如,在第2行,第4和第5栏应改为"NA",而在第3行,第4栏应保留"10“,第5栏应改为"NA”。到目前为止,我编码的内容如下:

代码语言:javascript
复制
a<-seq(1:16)  
b<-seq(1:18)

matrix2<- matrix(nrow=16, ncol=18)

for(i in 1:dim(matrix2)[1]) {
 for(j in 1:dim(matrix2)[2]) {
  matrix2[i,j] = if("matrix1[a,b]"=="matrix1[a,18]") {"matrix1[a,b]"} else {"NA"}
  }
}
print(matrix2)

返回的是一个包含"NA“的16行18列的矩阵。我几乎可以肯定,我的代码不只是一个问题。而且,事实上,这个条件只适用于矩阵12:16,3:17,但我不知道如何写这个。非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 10:42:29

你的描述有点混乱,但我读到你的文章在伪数学中的意思是:

代码语言:javascript
复制
x_new[i,j]= x[i,j] if x[i,j]=x[i,J] and else NA, for all i,j

其中J是矩阵中的列数。

这可以通过一个简单的ifelse语句来实现。考虑:

代码语言:javascript
复制
set.seed(42)
mat <- matrix(sample(1:3, 9, T), ncol=3)
mat
     [,1] [,2] [,3]
[1,]    3    3    3
[2,]    3    2    1
[3,]    1    2    2

mat2 <- ifelse(mat==mat[,ncol(mat)], mat, NA)
mat2
     [,1] [,2] [,3]
[1,]    3    3    3
[2,]   NA   NA    1
[3,]   NA    2    2

在这里,ncol(mat)表示矩阵的最后一列。你可以很容易地根据你的需要调整这些。如果要排除第一列,请使用mat[,-1],如

代码语言:javascript
复制
mat2 <- ifelse(mat[,-1]==mat[,ncol(mat)], mat[,-1], NA)

编辑:您澄清了只希望检查第一行是否相等。这可以通过以下几点来实现。首先,让我们创建一个具有不同行数和列数的矩阵,如您的示例所示:

代码语言:javascript
复制
set.seed(42)
mat <- matrix(sample(1:3, 12, T), ncol=4)
mat
     [,1] [,2] [,3] [,4]
[1,]    3    3    3    3
[2,]    3    2    1    2
[3,]    1    2    2    3

现在,我们需要知道第一行和最后一列中的每个条目组合是否相等。outer可以这样做:

代码语言:javascript
复制
ind <- t(outer(mat[1,], mat[,ncol(mat)], FUN = `==`))
ind
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE  TRUE  TRUE  TRUE
[2,] FALSE FALSE FALSE FALSE
[3,]  TRUE  TRUE  TRUE  TRUE

这可以与简单的ifelse-statement一起使用。

代码语言:javascript
复制
mat2 <- ifelse(ind, mat, NA)
mat2
     [,1] [,2] [,3] [,4]
[1,]    3    3    3    3
[2,]   NA   NA   NA   NA
[3,]    1    2    2    3

与前面一样,您可以用通常的子设置排除第一列或最后一列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43802403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档