Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据另一个矩阵的条件为一个矩阵编写for循环?_R_Loops_If Statement_Matrix - Fatal编程技术网

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

如何根据另一个矩阵的条件为一个矩阵编写for循环?,r,loops,if-statement,matrix,R,Loops,If Statement,Matrix,我试图根据另一个矩阵的条件得到一个新的矩阵。原始矩阵(矩阵1)如下所示: [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 |20

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

[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行中,第四列和第五列应替换为“NA”,而在第3行中,第四列应保留为“10”,第五列应替换为“NA”。 以下是我到目前为止编写的代码:

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)

a你的描述有点让人困惑,但我读到你的文章是指伪数学:

x_new[i,j]= x[i,j] if x[i,j]=x[i,J] and else NA, for all i,j
其中
J
是矩阵中的列数

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

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

编辑:您明确表示只希望检查第一行的相等性。这可以通过以下方法实现。首先,让我们创建一个具有不同行数和列数的矩阵,如您的示例所示:

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
这可以与一个简单的
ifelse
-语句一起使用

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

mat2非常感谢您的帮助!很抱歉,我的描述令人困惑,我现在正努力做得更好。您的代码生成的矩阵只包含最后一列中的名称(name1、name2等)(和NA值)。不过,我需要的是一个矩阵,其中包含最后一列中的名称和实际数据(请参见我的问题,使用的示例是10和20)-但仅在行尾的名称与单元格正上方顶行中的名称相同的单元格中。第三行,例如,应产生NA,NA,NA,10,NA,…,名称2。我希望现在更清楚了。
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
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